在Python中将dict从键/值对扩展为键/值对

时间:2014-09-10 14:59:27

标签: python dictionary

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

2 个答案:

答案 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 setadd代替listappend

from collections import defaultdict
myNewDict = defaultdict(set)
for staff_id, names in myDict.items():
    for name in names:
        myNewDict[name].add(staff_id)