撤消默认字典

时间:2015-11-08 21:41:50

标签: python dictionary

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

我的词典结构示例如下

{(2, '-', 3): [('Canada', 'Trudeau'),('Obama', 'USA')]}

无论如何要反转这一点,所以我得到了反之亦然的价值

4 个答案:

答案 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)

除非我误解你的意思是“反向”(交换键值,反之亦然):

You can’t use lists as keys, since lists can be modified in place using index assignments, slice assignments, or methods like append() and extend().

注意:正如其他答案所暗示的那样,如果你将列表转换为某种不可变类型,你可以将它们用作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)}