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}
要小心,如果不能“翻”字典
- 多个密钥共享相同的值。 例如
{'one':1,'two':1}
。 新的字典只能有一个项目与关键1
。 - 一个或多个值是不可能的。 例如
{'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