2013-08-27 48 views
0

我有一個名稱列表:字符串未被識別爲一個列表名稱

list_123_456 = [1,2,3] 

然後我用一個文件名的某些部分重新創建這個列表的名稱:

name = 'list_{0}_{1}' .format(filename[0:3],filename[6:9]) 

該作品就像我想要的那樣,'名字'現在等於'list_123_456'。但是代碼將它視爲一個字符串而不是我在開始時定義的列表。

例如,如果我嘗試:

len(name) 

我得到的答案「12」(名稱中的字母),而這「3」,我想。

任何幫助將是偉大的,謝謝。

+0

這是因爲'name'是一個字符串。您可能想要獲取與該變量名稱關聯的對象,可能使用'eval',這是不推薦的 – inspectorG4dget

+2

我上次查找時發現了11個獨立的dups,並且每個人都鏈接到其他幾個人...... – abarnert

回答

2

什麼你想要做的是幾乎總是一個壞主意。如果你只是創建的,而不是一堆獨立變量的字典,這是微不足道的:

lists = {} 
lists[('123', '456')] = [1, 2, 3] 
# ... 

現在,而不是這樣的:

name = 'list_{0}_{1}' .format(filename[0:3],filename[6:9]) 

...你可以這樣做:

name = lists[(filename[0:3], filename[6:9])] 

你當然可以將字典關鍵字關閉'list_123_456'而不是('123', '456'),或使用兩級嵌套字典,所以你可以寫lists[filename[0:3]][filename[6:9]] ......無論你發現什麼可讀。


如果你真的,真的無論如何要做到這一點,你可以查找一個變量名,如果你知道你要在評估它的範圍,以獲得其價值,因爲globals()locals()MyClass.__dict__等。總是可以訪問的,而且它們是字典。所以:

name_name = 'list_{0}_{1}' .format(filename[0:3],filename[6:9]) 
name = globals()[name_name] 

如果最壞的情況出現,你甚至可以eval(name_name)。但這是一個更糟的想法。


請參閱this blog post瞭解更多詳情。

1

您可以按名稱使用locals()詞典讓你列表:

>>> list_123_456 = [1,2,3] 
>>> locals()['list_123_456'] 
[1, 2, 3] 

但是,這是不是一個好的做法。相反,考慮制定字典,映射列表的名稱與實際名單:

>>> data = {'list_123_456': list_123_456} 
>>> data['list_123_456'] 
[1, 2, 3] 
1

但代碼把它當作一個字符串,而不是因爲我在一開始定義的列表。

這是因爲它是一個字符串。字符串不能與變量互換(因爲它們通常被稱爲,儘管「名稱」也是一個很好的術語)。

在一般情況下,如果你想使用計算機名稱(即一個字符串)來查找一個數據,你應該把它存放在dict

byname = {'list_123_456':[1,2,3]} 
byname[name] #=> [1,2,3] 
相關問題