2017-03-02 66 views
-1
列表創建字典

我的目錄列表看起來是這樣的:的Python:從列表

[[4,'apples'],[3,'oranges'],[4,'bananas'],[2,'apples'],[2,'pineapple'],[3,'apples']] 

我想創建這樣的字典,其中每個項目的值列: 例如,我想下面的輸出:

{4:'apples','bananas', 3:'oranges','apples', 2:'apples', 'pineapple'} 
+1

'4:['蘋果','香蕉']'? – depperm

回答

1

dict.setdefault可以在這裏幫助,如果你不想使用collections.defaultdict

lst = [[4,'apples'],[3,'oranges'],[4,'bananas'],[2,'apples'],[2,'pineapple'],[3,'apples']] 

dct = {} 

for num, name in lst: 
    dct.setdefault(num, []).append(name) 

print(dct) 
#{2: ['apples', 'pineapple'], 
# 3: ['oranges', 'apples'], 
# 4: ['apples', 'bananas']} 

然而defaultdict通常是更好的,更全面的解決方案。

+0

,我只是好奇而改變了它,它比defaultdict快,即使你在每次迭代時創建一個有時不需要的列表。 –

+0

@ Jean-FrançoisFabre它並不總是更快,進一步優化它使用一個綁定的方法'dctsetdefault = dct.setdefault'並在循環中使用!但實際的時間取決於列表的長度和重複鍵的數量(甚至可能在其他東西上)。如果使用'iteration_utilities.groupedby(lst,key = operator.itemgetter(0),keep = operator.itemgetter(1))'(但需要導入'operator'-模塊和一個外部庫),請關注速度。 – MSeifert

0

使用collections.defaultdict

result = defaultdict(list) 
for key, value in [[4,apples],[3,oranges],[4,bananas],[2,apples],[2,pineapple],[3,apples]]: 
    result[key].append(value) 
0

collections.defaultdict可能對您有用。

from collections import defaultdict 


items = [ 
    [4, "apples"], 
    [3, "oranges"], 
    [4, "bananas"], 
    [2, "apples"], 
    [2, "pineapple"], 
    [3, "apples"] 
] 

mapping = defaultdict(list) 
for number, name in items: 
    mapping[number].append(name) 

defaultdict官方文檔的例子會對您有所幫助。爲您服務

https://docs.python.org/3/library/collections.html#defaultdict-examples

1

機構代碼:

lst = [['4','apples'],['3','oranges'],['4','bananas'],['2','apples'],['2','pineapple'],['3','apples']] 

result = {} 
for item in lst: 
    key = item[0] 
    try: 
     result[key].append(item[1]) 
    except: 
     result[key] = [item[1]] 

print(result) 
# {'3': ['oranges', 'apples'], '2': ['apples', 'pineapple'], '4': ['apples', 'bananas']} 

如前所述通過@讓 - 弗朗索瓦·法布爾,該解決方案是相當緩慢:3,5秒BS5.7秒100000次迭代3, 5是defaultdict的解決方案。

+0

@ Jean-FrançoisFabre:你有比較? – Jan

+0

是的,並且由於例外情況而如預期那樣較慢。您可能需要處理更大的數據以查看這些數據,但使用現有數據,您可以使用解決方案在100000次迭代中獲得3,5秒bs 5.7秒。 –

+0

@ Jean-FrançoisFabre:謝謝你的提示,我會更新答案以反映你的想法。 – Jan