我有一个defaultdict(list),其中我的键是tuple类型,我的值是元组列表.我想要反转这个字典,我已经尝试使用zip功能,这不起作用
我的字典结构的示例如下
{(2, '-', 3): [('Canada', 'Trudeau'),('Obama', 'USA')]}
Run Code Online (Sandbox Code Playgroud)
无论如何要反过来,所以我得到了关键和价值观
由于你有一个列表的字典,你需要使列表成为一个不可变类型,用作Python字典中的键.
您可以使列表值元组:
>>> di={(2, '-', 3): [('Canada', 'Trudeau'),('Obama', 'USA')]}
>>> {tuple(v):k for k, v in di.items()}
{(('Canada', 'Trudeau'), ('Obama', 'USA')): (2, '-', 3)}
Run Code Online (Sandbox Code Playgroud)
或者将它们变成字符串:
>>> {repr(v):k for k, v in di.items()}
{"[('Canada', 'Trudeau'), ('Obama', 'USA')]": (2, '-', 3)}
Run Code Online (Sandbox Code Playgroud)
使用其中任何一个,如果需要,您可以将密钥重新转换为列表:
>>> from ast import literal_eval
>>> literal_eval("[('Canada', 'Trudeau'), ('Obama', 'USA')]")
[('Canada', 'Trudeau'), ('Obama', 'USA')]
>>> list((('Canada', 'Trudeau'), ('Obama', 'USA')))
[('Canada', 'Trudeau'), ('Obama', 'USA')]
Run Code Online (Sandbox Code Playgroud)
(顺便说一句:eval如果代码可能有任何外部字符串,请不要使用- 在生产代码中使用ast.literal_eval,如下例所示.)
最后,考虑一下这个词:
di={'key 1':'val', 'key 2': 'val', 'key 3': 'val'}
Run Code Online (Sandbox Code Playgroud)
当您反转键和值时,您将在添加每个键'val'时丢失数据.
您可以使用默认的dict来解决成为键的重复值:
dd=defaultdict(list)
for k, v in di.items():
dd[v].append(k)
>>> dd
defaultdict(<type 'list'>, {'val': ['key 1', 'key 2', 'key 3']})
Run Code Online (Sandbox Code Playgroud)