2012-02-26 45 views
3

如何使用列表理解来构建字典?如何使用列表理解建立字典?

我有两个列表。

series = [1,2,3,4,5] 
categories = ['A', 'B', 'A', 'C','B'] 

我想建立一个字典,其中的类别是关键。

谢谢您的回答我期待产生:

{'A' : [1, 3], 'B' : [2, 5], 'C' : [4]} 

由于密钥不能存在两次

+0

什么是你想要的输出? '{'A':[1,3],'B':[2,5],'C':[4]}? – Nobody 2012-02-26 16:12:41

+0

是的,这将是理想的 – klabs 2012-02-26 16:13:07

回答

10

你必须有一个元组列表。元组是键/值对。你不需要理解在这种情况下,只是压缩:

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]}

+0

这将产生“{'A':3,'C':4,'B':5}”,我不确定这是OP想要什么。 – DSM 2012-02-26 16:10:55

+0

感谢克里斯,虽然我的结果字典里只有3件物品。 – klabs 2012-02-26 16:11:00

+0

你应该使用'defaultdict'而不是'setdefault'的标准字典。即'map = defaultdict(list)' – Voo 2012-02-26 16:41:30

0

原则上你可以做克里斯建议:dict(zip(categories, series)),要知道,不能有重复的categories(作为示例代码)。

编辑:

现在你已经澄清你的原意,这将如预期:

from collections import defaultdict 
d = defaultdict(list) 
for k, v in zip(categories, series): 
    d[k].append(v) 
0
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) 
+0

这将产生{'A':3,'C':4,'B':5}我在{'A':[1,3],'B':[2,5],'C ':[4]} – klabs 2012-02-26 16:16:03

3

与其被聪明(我有一个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]} 

这已不是一个而是列表内涵,是非常低效的引导。

+0

这是最好的答案,但不使用列表理解 – klabs 2012-02-26 16:21:53

+0

'{c0:[s for c,s in zip(categories,series)if c == c0] for i,c0 in enumerate类别)如果c0不在类别[i + 1:]}',内部循环仍然是列表理解,顺便说一句。 :\ – neizod 2012-02-26 16:56:47

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)