Python:用字典中的值交换密钥的最佳方法?

我收到一个字典作为input,并希望返回一个字典,其中的键将是input的值,其值将是相应的input键。 价值观是唯一的。

例如,说我的input是:

a = dict() a['one']=1 a['two']=2 

我想我的输出是:

 {1: 'one', 2: 'two'} 

为了澄清,我希望我的结果等同于以下内容:

 res = dict() res[1] = 'one' res[2] = 'two' 

任何整洁python的方式来实现这一目标?

谢谢

 res = dict((v,k) for k,v in a.iteritems()) 
 new_dict = dict (zip(my_dict.values(),my_dict.keys())) 

从Python 2.7开始,包括3.0+,有一个可以说是更短,更可读的版本:

 >>> my_dict = {'x':1, 'y':2, 'z':3} >>> {v: k for k, v in my_dict.items()} {1: 'x', 2: 'y', 3: 'z'} 
 In [1]: my_dict = {'x':1, 'y':2, 'z':3} In [2]: dict((value, key) for key, value in my_dict.iteritems()) Out[2]: {1: 'x', 2: 'y', 3: 'z'} 

你可以使用字典理解 :

 res = {v: k for k, v in a.iteritems()} 

你可以尝试:

 d={'one':1,'two':2} d2=dict((value,key) for key,value in d.iteritems()) d2 {'two': 2, 'one': 1} 

要小心,如果不能“翻”字典

  1. 多个密钥共享相同的值。 例如{'one':1,'two':1} 。 新的字典只能有一个项目与关键1
  2. 一个或多个值是不可能的。 例如{'one':[1]}[1]是有效的值,但不是有效的密钥。

请参阅python邮件列表上的这个主题以获得关于这个主题的讨论。

 new_dict = dict( (my_dict[k], k) for k in my_dict) 

甚至更好,但只适用于Python 3:

 new_dict = { my_dict[k]: k for k in my_dict} 

res = dict(zip(a.values(), a.keys()))

另一种扩展Ilya Prokin的反应的方法是实际使用reversed函数。

 dict(map(reversed, my_dict.items())) 

从本质上讲,你的字典是迭代的(使用.items() ),其中每个项目是一个键/值对,这些项目与reversed函数交换。 当这是传递给dict构造函数,它将它们变成价值/密钥对,这是你想要的。

对Javier改进的build议回答:

 dict(zip(d.values(),d)) 

而不是d.keys()你可以只写d ,因为如果你用迭代器来查看字典,它将返回相关字典的键。

防爆。 对于这种行为:

 d = {'a':1,'b':2} for k in d: k 'a' 'b' 

如果您使用的是Python3,则略有不同:

 res = dict((v,k) for k,v in a.items()) 

使用循环 : –

 newdict = {} #Will contain reversed key:value pairs. for key, value in zip(my_dict.keys(), my_dict.values()): # Operations on key/value can also be performed. newdict[value] = key 
 dict(map(lambda x: x[::-1], YourDict.items())) 

.items()返回(key, value)的元组列表。 map()遍历列表中的元素并将lambda x:[::-1]到它的每个元素(元组)以反转它,所以每个元组变成(value, key)在新列表中。 最后, dict()从新列表中做出一个字典。

添加就地解决scheme:

 >>> d = {1: 'one', 2: 'two', 3: 'three', 4: 'four'} >>> for k in list(d.keys()): ... d[d.pop(k)] = k ... >>> d {'two': 2, 'one': 1, 'four': 4, 'three': 3} 

在Python3中,使用list(d.keys())至关重要,因为dict.keys返回键的视图 。 如果你使用Python2, d.keys()就足够了。

当前的主要答案假定价值是独一无二的,并非总是如此。 如果价值不是唯一的呢? 你会失去信息! 例如:

 d = {'a':3, 'b': 2, 'c': 2} {v:k for k,v in d.iteritems()} 

返回{2: 'b', 3: 'a'}

关于'c'的信息完全被忽略了。 理想情况下,应该是{2: ['b','c'], 3: ['a']} 。 这是底层实现的function。

 def reverse_non_unique_mapping(d): dinv = {} for k, v in d.iteritems(): if v in dinv: dinv[v].append(k) else: dinv[v] = [k] return dinv