2012-02-26 19 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) 
相關問題