[英]How do I build a dict using list comprehension?
如何使用列表理解构建一个字典?
我有两个清单。
series = [1,2,3,4,5]
categories = ['A', 'B', 'A', 'C','B']
我想建立一个类别是键的字典。
感谢您的回答我想要制作:
{'A' : [1, 3], 'B' : [2, 5], 'C' : [4]}
因为密钥不能存在两次
你必须有一个元组列表。 元组是键/值对。 在这种情况下你不需要理解,只需zip:
dict(zip(categories, series))
产生{'A': 3, 'B': 5, 'C': 4}
(如评论所指出)
编辑:查看键后,请注意您不能在字典中重复键。 因此,如果不进一步澄清您的需求,我不确定您正在寻找什么解决方案。
编辑:为了得到你想要的东西,用setdefault或defaultdict做一个for循环可能是最容易的。
categoriesMap = {}
for k, v in zip(categories, series):
categoriesMap.setdefault(k, []).append(v)
这应该产生{'A': [1, 3], 'B': [2, 5], 'C': [3]}
from collectons import defaultdict
series = [1,2,3,4,5]
categories = ['A', 'B', 'A', 'C','B']
result = defaultdict(list)
for key, val in zip(categories, series)
result[key].append(value)
而不是聪明(我有一个我喜欢的itertools解决方案),一个好的,老式的for循环没有错:
>>> from collections import defaultdict
>>>
>>> series = [1,2,3,4,5]
>>> categories = ['A', 'B', 'A', 'C','B']
>>>
>>> d = defaultdict(list)
>>> for c,s in zip(categories, series):
... d[c].append(s)
...
>>> d
defaultdict(<type 'list'>, {'A': [1, 3], 'C': [4], 'B': [2, 5]})
这不使用列表理解,因为列表理解是错误的方法。 但是因为你似乎真的想要一个出于某种原因:怎么样:
>> dict([(c0, [s for (c,s) in zip(categories, series) if c == c0]) for c0 in categories])
{'A': [1, 3], 'C': [4], 'B': [2, 5]}
这不仅仅是两个列表推导,而且启动效率非常低。
原则上你可以像克里斯建议的那样做: dict(zip(categories, series))
,只要知道categories
不能有重复categories
(如示例代码中所示)。
编辑:
既然您已经明确了自己的意图,那么这将按预期工作:
from collections import defaultdict
d = defaultdict(list)
for k, v in zip(categories, series):
d[k].append(v)
d={ k:[] for k in categories }
map(lambda k,v: d[k].append(v), categories, series )
结果:
d is now = {'A': [1, 3], 'C': [4], 'B': [2, 5]}
或(等效)使用setdefault(感谢Kris R.)
d={}
map(lambda k,v: d.setdefault(k,[]).append(v), categories, series )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.