myDict = {'121': ['adrian', 'alex', 'peter'], '122': ['john', 'vic', 'bill']}
我想'扩展'我的字典,以便每个键/值对包含一个值,而不是列表。尝试使用myDict.keys()和myDict.values()进行迭代并构造一个新的dict,但没有成功(我对python3很新)。这就是我想要实现的目标:
myNewDict = {'121': 'adrian', '121': 'alex', '121': 'peter', '122': 'john', '122': 'vic', '122':'bill'}
答案 0 :(得分:1)
如果您不关心碰撞被破坏,这里是一个单行解决方案(加上导入):
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>)
Reduce接受一个功能并应用它
累加到序列项,从左到右,以便将序列减少为单个值。
dict(mydict, **yourdict)
通过argument unpacking结合词典。
这意味着这将从列表中获取第一个字典,并将其与列表中的下一个字典组合,然后依此类推,直到列表中的所有字典组合成一个大字典。 / p>
所有这一切,我可能会做这样的事情:
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}
答案 1 :(得分:0)
根据上面的评论,这里是如何反转dict并允许每个键的多个值:
from collections import defaultdict
myNewDict = defaultdict(list)
for staff_id, names in myDict.items():
for name in names:
myNewDict[name].append(staff_id)
如果订单无关紧要,您可以使用defaultdict
set
和add
代替list
和append
:
from collections import defaultdict
myNewDict = defaultdict(set)
for staff_id, names in myDict.items():
for name in names:
myNewDict[name].add(staff_id)