2011-05-26 72 views
2

Python初學者在這裏。關於字典的問題。字典變量名?

我的輸入是一個可變長度列表(例如,a = ['eggs','ham','bacon'...]),它用作在導入的CSV文件上使用的搜索項列表。

我已經定義了四個函數,使每個術語與來自所述CSV文件的各種值匹配。因此,每個輸入術語將產生四個結果列表。

我想將輸入條款作爲關鍵字存儲在字典中(非常簡單)並將結果四個列表作爲值存儲(也很簡單)。

然而,因爲輸入列表的長度是可變的,我想建立一個功能,「TERM2」來定義和命名的字典「TERM1」,示出非常基本上從而:

term1 = { 'eggs' : [[list1] , [list2] , [list3] , [list4]] } 
term2 = { 'ham' : [[list1] , [list2] , [list3] , [list4]] } 
term3 = { 'bacon' : [[list1] , [list2] , [list3] , [list4]] } 

是否有a)這樣命名字典的方法?和b)並讓它們全球可用?如果是這樣,怎麼樣?任何和所有的幫助非常感謝。

+7

爲什麼你不定義一個包含所有數據的字典呢?它將更容易操縱它並訪問它的值 – eumiro 2011-05-26 11:41:24

+0

你的示例是無效的Python。你有一個具有多個值的鍵,這是一個'SyntaxError:invalid syntax'。 – 2011-05-26 11:48:17

+0

@Joe不,它是不是錯過了值的外括號?它們都是列表的列表。我可以粘貼將代碼放到解釋器中(提供的是我定義的list1..list4),Python解析它就好了。 – 2011-05-26 12:04:23

回答

2

不是我推薦的方法,但可以作爲字典訪問本地和全局命名空間;例如你可以添加任意變量使用熟悉的字典接口的命名空間:

>>> globals()['foo'] = 'bar' 
>>> foo 
'bar' 
>>> locals()['spam'] = 'eggs' 
>>> spam 
'eggs' 

碰上命名衝突,但。另外,你的代碼的其餘部分如何知道全局變量包含你的結果?他們也必須做間接查找!

您最好只使用一個包含結果的字典,並讓它成爲名稱空間而不是全局名稱空間。

+0

爲什麼-1票?我確實說如果他們可以幫助它OP真的不想這樣做。 – 2011-05-26 12:00:15

+1

Downvote工具提示顯示「此答案無用」。這不是我的失望,但我會質疑以「不是我推薦的方法......」開頭的答案的有用性(或甚至實用性) - 爲什麼要先放在首位呢?尤其是因爲OP的情況並不在可能需要您描述的方法的邊緣情況附近。 – PaulMcG 2011-05-26 12:09:09

+1

修改當地人()被禁止http://docs.python.org/library/functions.html#locals – 2011-05-26 12:54:03

3

你可以嘗試這樣的事情:

results = {} 
for name in ['eggs', 'ham', 'bacon']: 
    results[name] = (function1(name), function2(name), function3(name), function4(name),) 

其中functionX是你的職責將從CSV文件或任何返回LISTX結果。

在這裏,您將有結果dictionnary是這樣的:

results = { 
    'eggs' : (egg_list1, egg_list2, egg_list3, egg_list4), 
    'ham' : (ham_list1, ham_list2, ham_list3, ham_list4), 
    'bacon' : (bacon_list1, bacon_list2, bacon_list3, bacon_list4), 
} 
+0

如果每個函數都讀取CSV文件,那麼這個文件將被處理'(鍵數)×(函數數)'次。有時候這不會得到幫助,但通常有一種正交方式只讀取一次CSV文件,並在結果字典中更新值。 – PaulMcG 2011-05-26 12:23:59

+0

這工作得很好。謝謝您的幫助。 – Dingo 2011-05-27 06:56:20

3

這裏是你怎麼可能預先初始化一個字典包含的所有數據:

a = "eggs bacon ham".split() 
summary = dict((key,([],[],[],[])) for key in a) 

for lineno,line in enumerate(csv_file): 
    # first element in the line is assumed to be the key ("eggs", "bacon", etc.) 
    key = line[0] 
    # update the data values for this key 
    summary[key][0].append(lineno) 
    summary[key][1].append(something_else) 
    # ... etc. 

我覺得這種索引訪問雖然有點脆弱,但更喜歡鍵控或屬性訪問。 4列表的硬編碼列表可以更好地表示爲一個字典,或者甚至是一些簡單數據統計類的對象。當您在CSV文件中查找「煎餅」,「華夫餅」,「薯餅」等條目時,我認爲您的「雞蛋」,「培根」和「火腿」列表會隨着時間的推移而增長上。在我瀏覽數據文件或數據庫表時,我已經越來越多地使用defaultdict來統計數據了。取而代之的定義預先哪些鍵我希望得到(並具有當輸入數據被添加到其新的值更新列表我自己),defaultdict只是增加了表格的新條目,我定義:

class Tally(object): 
    def __init__(self): 
     self.count = 0 
     self.lines = [] 
     self.values = [] 

from collections import defaultdict 
summary = defaultdict(Tally) 

for lineno,line in enumerate(csv_file): 
    # first element in the line is assumed to be the key ("eggs", "bacon", etc.) 
    key = line[0] 
    # update the data values for this key 
    summary[key].count += 1 
    summary[key].lines.append(lineno) 
    summary[key].values.append(line[1]) 
    # ... etc. 

defaultdict爲我節省了繁瑣和重複的「如果關鍵不在總結:添加新條目...「開銷,所以我的代碼保持相當乾淨

+0

在這個階段,這對我來說有點高級,但我設法調整了你的技巧並使其運作起來。謝謝您的幫助。 – Dingo 2011-05-27 06:55:28