如何使用列表理解來構建字典?如何使用列表理解建立字典?
我有兩個列表。
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