反转默认字典

Nep*_*mer 3 python dictionary

我有一个defaultdict(list),其中我的键是tuple类型,我的值是元组列表.我想要反转这个字典,我已经尝试使用zip功能,这不起作用

我的字典结构的示例如下

{(2, '-', 3): [('Canada', 'Trudeau'),('Obama', 'USA')]}
Run Code Online (Sandbox Code Playgroud)

无论如何要反过来,所以我得到了关键和价值观

daw*_*awg 7

由于你有一个列表的字典,你需要使列表成为一个不可变类型,用作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)