我有一个defaultdict(list),其中我的键是tuple类型,我的值是元组列表。 我想要反转这个字典,我已经尝试过使用zip功能,这不起作用
我的词典结构示例如下
{(2, '-', 3): [('Canada', 'Trudeau'),('Obama', 'USA')]}
无论如何要反转这一点,所以我得到了反之亦然的价值
答案 0 :(得分:7)
由于你有一个列表的字典,你需要使列表成为一个不可变的类型,用作Python字典中的键。
您可以创建列表值元组:
>>> di={(2, '-', 3): [('Canada', 'Trudeau'),('Obama', 'USA')]}
>>> {tuple(v):k for k, v in di.items()}
{(('Canada', 'Trudeau'), ('Obama', 'USA')): (2, '-', 3)}
或者将它们变成字符串:
>>> {repr(v):k for k, v in di.items()}
{"[('Canada', 'Trudeau'), ('Obama', 'USA')]": (2, '-', 3)}
如果需要,您可以将密钥重新转换为列表:
>>> from ast import literal_eval
>>> literal_eval("[('Canada', 'Trudeau'), ('Obama', 'USA')]")
[('Canada', 'Trudeau'), ('Obama', 'USA')]
>>> list((('Canada', 'Trudeau'), ('Obama', 'USA')))
[('Canada', 'Trudeau'), ('Obama', 'USA')]
(顺便说一句:如果代码可能包含任何外部字符串,请不要使用eval
- 在生产代码中使用ast.literal_eval,如此示例所示。)
最后,考虑一下这个词:
di={'key 1':'val', 'key 2': 'val', 'key 3': 'val'}
当您反转键和值时,您将丢失数据,因为每个键' val'被添加。
您可以使用默认字典来解决重复值成为键:
dd=defaultdict(list)
for k, v in di.items():
dd[v].append(k)
>>> dd
defaultdict(<type 'list'>, {'val': ['key 1', 'key 2', 'key 3']})
答案 1 :(得分:2)
您不能这样做,因为您的值是可变的:[('Canada', 'Trudeau'),('Obama', 'USA')]
是一个列表,它不能成为字典中的键。也许你可以先改变它?
答案 2 :(得分:1)
除非我误解你的意思是“反向”(交换键值,反之亦然):
注意:正如其他答案所暗示的那样,如果你将列表转换为某种不可变类型,你可以将它们用作dict中的键。
答案 3 :(得分:0)
如果你的意思是列表中的每个元组都是一个关键字,那么这很简单(这里的D是dict
还是defaultdict
并不重要)
>>> D = {(2, '-', 3): [('Canada', 'Trudeau'),('Obama', 'USA')]}
>>> {k1: k for k, v in D.items() for k1 in v}
{('Canada', 'Trudeau'): (2, '-', 3), ('Obama', 'USA'): (2, '-', 3)}