我想在python字典中将键更改为值,但原始字典中的值不是唯一的。
这就是我所拥有的:
year_person = {2000: ‘Linda’, 2001: ‘Ron’, 2002: ‘Bruce’, 2003: ‘Linda’, 2004: ‘Bruce’, 2005 ‘Gary’, 2006: ‘Linda’}
这是我想要改为:
person_year = {‘Linda’: 2000, ‘Ron’: 2001, ‘Bruce’: 2002, ‘Linda’, 2003: ‘Bruce’, 2004 ‘Gary’, 2005: ‘Linda’: 2006}
当我尝试使用for循环转换它时,每个人只有一对匹配。
答案 0 :(得分:8)
您也可以使用defaultdict:
year_person = {2000: 'Linda', 2001: 'Ron', 2002: 'Bruce', 2003: 'Linda', 2004: 'Bruce', 2005: 'Gary', 2006: 'Linda'}
from collections import defaultdict
d = defaultdict(list)
for k, v in year_person.items():
d[v].append(k)
print dict(d)
>>> {'Bruce': [2002, 2004], 'Linda': [2000, 2003, 2006], 'Ron': [2001], 'Gary': [2005]}
答案 1 :(得分:3)
仅提供当前答案中可能缺少的一些其他选项和信息:
如果您确定您的值是唯一的,因此可以成为键,最简单的方法是理解:
year_person = {2000: 'Linda', 2001: 'Ron', 2002: 'Bruce', 2003: 'Linda', 2004: 'Bruce', 2005: 'Gary', 2006: 'Linda'}
person_year = {key: value for (value, key) in year_person.items()}
当然,在你的情况下,它们不是,所以这不起作用(因为它只给出找到的最后一个值):
person_year = {'Bruce': 2004, 'Linda': 2006, 'Ron': 2001, 'Gary': 2005}
相反,我们可以在dict comp中使用嵌套列表comp:
{key: [value for value, check_key in year_person.items() if check_key==key] for key in year_person.values()}
给我们:
{'Bruce': [2002, 2004], 'Linda': [2000, 2003, 2006], 'Ron': [2001], 'Gary': [2005]}
这样可行,但由于必须为每个条目循环遍历整个字典,因此效率不高。一个更好的解决方案是由alan给出的the defaultdict
solution,它只需要一个循环。
答案 2 :(得分:2)
你想达到的目标在技术上是不可行的。字典的键不能重复,因为如果是这样,您不能使用键唯一地索引字典。
您可以做的是创建(键,值)对的字典,其中value是具有相同键的所有项的列表。要实现它,您可以执行以下操作
>>> person_year={}
>>> [person_year.setdefault(v,[]).append(k) for (k,v) in year_person.iteritems()]
[None, None, None, None, None, None, None]
>>> person_year
{'Bruce': [2002, 2004], 'Linda': [2000, 2003, 2006], 'Ron': [2001], 'Gary': [2005]}
>>>
注意,如果您只对键值对感兴趣而不是词典本身',您可以将其存储为元组列表,如下所示
>>> [(v,k) for k,v in year_person.iteritems()]
[('Linda', 2000), ('Ron', 2001), ('Bruce', 2002), ('Linda', 2003), ('Bruce', 2004), ('Gary', 2005), ('Linda', 2006)]
>>>
答案 3 :(得分:2)
IMO,defaultdict
在这里是不必要的,并且作为列表理解这样做会牺牲可读性(尽管通常情况并非如此)。除非分析表明这确实是一个瓶颈,否则我会按如下方式进行:
def invert_to_lists(dct):
inverted_dict = {}
for key in dct:
inverted_dict.setdefault(dct[key], []).append(key)
return inverted_dict
defaultdict
是另一个复杂因素。在这种情况下使用setdefault
很好,因为它只需要输入一次。在完成导入和实例化defaultdict
的严格操作之后,您输入的内容不仅仅是调用setdefault
。