2017-03-02 36 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