[英]Turning a Python dict with mutiple values in to a list with every key value pair
[英]Extend dict from key/values pair to key/value pair in Python
myDict = {'121': ['adrian', 'alex', 'peter'], '122': ['john', 'vic', 'bill']}
我想“擴展”我的字典,以便每個鍵/值對都包含一個值,而不是列表。 嘗試使用myDict.keys()和myDict.values()進行迭代,並構造新的字典,但沒有解決(我對python3還是很陌生)。 這是我要實現的目標:
myNewDict = {'121': 'adrian', '121': 'alex', '121': 'peter', '122': 'john', '122': 'vic', '122':'bill'}
如果您不關心碰撞被破壞,這里是一線解決方案(加上導入):
import functools
myDict = {'121': ['adrian', 'alex', 'peter'], '122': ['john', 'vic', 'bill']}
print(functools.reduce( lambda x,y: dict(x, **y), (dict(map(lambda x: (x,i), myDict[i])) for i in myDict)))
打破這是做什么的:
# This is a generator that creates a new dictionary out of each key/valuelist
(dict(map(lambda val: (val,key), myDict[key])) for key in myDict)
# => {'adrian': '121', 'alex': '121': 'peter': '121'}
# => {'john': '122', 'bill': '122', 'vic': '122'}
一旦有了,那就打電話
functools.reduce( lambda x,y: dict(x, **y), <generator here>)
減少功能並應用
從左到右累積到序列項,以便將序列減少為單個值。
dict(mydict, **yourdict)
通過參數解包的方式組合字典。
這意味着它將從列表中選取第一個詞典,然后將其與列表中的下一個詞典進行合並,如此反復進行直到列表中的所有詞典都合並為一個完整的詞典為止。
話雖這么說,我可能會做這樣的事情:
inverted = dict((name, k) for k, v in myDict.items() for name in v)
使用字典理解的替代語法:
inverted = {name: k for k, v in myDict.items() for name in v}
根據上面的評論,這是如何反轉字典並為每個鍵允許多個值的方法:
from collections import defaultdict
myNewDict = defaultdict(list)
for staff_id, names in myDict.items():
for name in names:
myNewDict[name].append(staff_id)
如果順序無關緊要,則可以使用set
和add
而不是list
和append
的defaultdict
:
from collections import defaultdict
myNewDict = defaultdict(set)
for staff_id, names in myDict.items():
for name in names:
myNewDict[name].add(staff_id)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.