2013-03-13 67 views
3

所以我基本上有類似名稱的元素非常大名單(C0,D0,C1,D1 ...等)我正在尋找一種簡單的方法來生成Python代碼

,我想知道如果是,將基本上生成一個腳本使用字符串

會改變一個字符串「C0」到實際的變量C0產生這些元素的簡單的方法

我想避免使用列表,並會而是生成代碼,因爲與我的項目相關的原因

謝謝你們!

+3

現在你讓我琢磨那些原因可能是什麼,而不是你的代碼生成的模板引擎...... – flup 2013-03-13 00:45:05

+3

毫無疑問,如果你有100個類似命名的變量,那麼很有可能有一種解決頂級問題的更好方法... – 2013-03-13 00:45:19

+0

你能解釋爲什麼要使用代碼生成嗎?代碼生成可能不是解決此問題的最佳解決方案。 – 2013-03-13 00:48:10

回答

-1

實際上,你可以聲明使用vars()以字符串格式的變量,文檔here

例如,

如果我有列表,names

names = ['a','b','c','d'] 

我可以這樣做:

for i,k in enumerate(names): 
    vars()[k] = i*2 #k is the names 

>>>print a 
0 
>>>print b 
2 
>>>print c 
4 

編輯

有使用exec文檔here

for i,k in enumerate(names): 
    exec(k + '=%s' % i) #k is the names 

>>>print a 
0 
>>>print b 
1 
>>>print c 
2 
+3

您錯過了文檔中說「'注意,本地字典僅用於讀取的部分,因爲本地字典的更新被忽略。」 - 它在這裏工作的唯一原因是因爲在全局名稱空間中,當地人返回不被忽略的'globals'。 – mgilson 2013-03-13 00:53:48

-1

getattrlocals,並globals另一種方法。

如果你的變量是本地的功能,你可以這樣做。如果您的變量是全局使用globals()

for i in len(100): 
    first_name = "c{0}".format(i) 
    second_name = "d{0}".format(i) 
    if(locals()[first_name] == locals()[second_name]): 
     print("hello") 
-1

你可以使用eval函數:

for i in xrange(100): 
    if eval('c%d' % i) == eval('d%d' % i): 
     print "Hello!" 
2

首先,不要拿這個,但我假設你根據你的問題的代碼是新來的Python錯誤的方法:它不是有效的Python。遍佈各地的大量Python教程 - 閱讀了Python函數,內置函數和一般哲學。這是一個非常強大的語言,但它看起來像你繼承的腳本是...不是非常Pythonic。一定不要從中學習有關語言的錯誤信息。

因此,理想情況下,您希望將所有這些變量收集在某種數據結構中。 Python有許多不同的類型。

如果您只需比較一組固定數據集中的每個索引,就可以避免使用元組:這些是有序的,不可變的集合,它暗示着一些結構。假設您有n數據對:您有兩個元組,我們稱它們爲cd,但如果可以的話,使用描述性名稱顯然會更好。它應該是這樣的:

c = (c0, c1, c2, ... cn) 
d = (d0, d1, d2, ... dn) 

而且你他們是這樣的比較:

for i in range(len(c)): 
    if c[i] == d[i]: 
     print '%d: match' % i 
    else: 
     print '%d: no match' % i 

(兩點需要注意:LEN()找到一個對象的長度,範圍()創建一個可重複序列 - 你的問題使用len(),你想在Python中使用range(),並且%d的東西只是字符串格式。)

我的假設是你需要更多。首先,如果編寫這個東西的人認爲將數據存儲爲數百個獨特的全局變量是一個好主意,那麼我不會認爲他會這樣做,比如確保每個變量存在並在運行時保存數據等所以我個人在這種情況下使用字典,因爲它給你更多的靈活性。

每個字典都是key:value對的集合。口號是無序的,所以你不能直接比較每一箇中的第一個項目 - 沒有第一個項目。 可以用做的是使用一個整數序列作爲關鍵字,然後遍歷該序列的範圍。你可以做這樣的事情有一個默認的檢索值,這樣你就不會崩潰的程序,如果C64從來沒有得到聲明:

c = {0:'a', 1:'b', 2:'c', 3:'d', 4:'r'} 
d = {0:'a', 1:'B', 2:None, 3:'d'} 

然後是這樣的:

for i in range(len(c)): 
    if c.get(i, 'No value') == d.get(i, 'No value'): 
     print '%d: match' % i 
    else: 
     print '%d: no match' % i 

雖然你會通常從c[4]d['apple']這樣的字典中檢索數據。 Get()允許我們使用缺省值('No value'),以防缺失一些值i。 (另一個假設:每一對數據代表一些真實的數據關係,所以迭代次數在語義上是一個標籤,就像它是一個索引一樣,在我看來,鍵通常應該是標籤而不是數值本身)

你在評論中提出的建議,將現有變量收集到這些結構之一中,可以正常工作。只需打開Notepad ++並使用源代碼進行一些智能搜索/替換,應該花費10分鐘。你最終會得到c = (c0, c1, c2, etc)c = {0:c0, 1:c1, etc},或者如果你找到另一種適合你的需求的結構,你會得到不同的結果。但是我真的認爲你應該做的是重構整個腳本,以便你正在比較的數據存儲在某種對象中,以反映它是什麼以及如何使用它。 Python會讓你在這裏發揮真正的魔力:通過一點點修改,你可以做一些簡單的事情,找到c == d,尋找聯合或不相交的集合,找到在某些迭代中操縱數據值或者任何你想要的東西需要。

+0

謝謝你!我對python是半新的,我實際上知道那不是正確的python,我原本寫它是正確的,我意識到它沒有傳達我想傳達的想法。我認爲寫一本字典可能是我最好的選擇。非常感謝你! – 2013-03-13 02:27:04

+0

@DanielImberman太棒了,我很高興這讓你走上正軌。我建議稍微修改一下你的問題,以反映你真的想要處理一個糟糕的無組織數據的腳本,而不是本身的代碼生成。你可能會得到更多關於如何解決問題的指針。 – toxotes 2013-03-13 02:37:17

相關問題