如何使用列表理解来构建字典?如何使用列表理解建立字典?
我有两个列表。
series = [1,2,3,4,5]
categories = ['A', 'B', 'A', 'C','B']
我想建立一个字典,其中的类别是关键。
谢谢您的回答我期待产生:
{'A' : [1, 3], 'B' : [2, 5], 'C' : [4]}
由于密钥不能存在两次
如何使用列表理解来构建字典?如何使用列表理解建立字典?
我有两个列表。
series = [1,2,3,4,5]
categories = ['A', 'B', 'A', 'C','B']
我想建立一个字典,其中的类别是关键。
谢谢您的回答我期待产生:
{'A' : [1, 3], 'B' : [2, 5], 'C' : [4]}
由于密钥不能存在两次
你必须有一个元组列表。元组是键/值对。你不需要理解在这种情况下,只是压缩:
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]}
原则上你可以做克里斯建议:dict(zip(categories, series))
,要知道,不能有重复的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)
这将产生{'A':3,'C':4,'B':5}我在{'A':[1,3],'B':[2,5],'C ':[4]} – klabs 2012-02-26 16:16:03
与其被聪明(我有一个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]}
这已不是一个而是列表内涵,是非常低效的引导。
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)
什么是你想要的输出? '{'A':[1,3],'B':[2,5],'C':[4]}? – Nobody 2012-02-26 16:12:41
是的,这将是理想的 – klabs 2012-02-26 16:13:07