我收到一个字典作为输入,并希望返回一个字典,其键将是输入的值,其值将是相应的输入键。价值观是独一无二的。
例如,我的输入是:
a = dict()
a['one']=1
a['two']=2
我希望我的输出为:
{1: 'one', 2: 'two'}
澄清我希望我的结果等同于以下内容:
res = dict()
res[1] = 'one'
res[2] = 'two'
任何巧妙的Python方式来实现这个目标吗?
由于
答案 0 :(得分:118)
Python 2:
res = dict((v,k) for k,v in a.iteritems())
Python 3(感谢@erik):
res = dict((v,k) for k,v in a.items())
答案 1 :(得分:50)
new_dict = dict (zip(my_dict.values(),my_dict.keys()))
答案 2 :(得分:44)
从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'}
答案 3 :(得分:30)
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'}
答案 4 :(得分:25)
您可以使用dict comprehensions:
res = {v: k for k, v in a.iteritems()}
已编辑:对于Python 3,请使用a.items()
代替a.iteritems()
。关于它们之间差异的讨论可以在iteritems in Python上找到。
答案 5 :(得分:18)
你可以尝试:
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邮件列表上的this thread。
答案 6 :(得分:14)
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}
答案 7 :(得分:13)
res = dict(zip(a.values(), a.keys()))
答案 8 :(得分:10)
扩展Ilya Prokin响应的另一种方法是实际使用reversed
函数。
dict(map(reversed, my_dict.items()))
本质上,您的字典是通过(使用.items()
)进行迭代的,其中每个项目都是键/值对,并且这些项目与reversed
函数交换。当它传递给dict
构造函数时,会将它们转换为值/键对,这就是你想要的。
答案 9 :(得分:9)
当前的主要答案假设值是唯一的,但并非总是如此。如果值不是唯一的怎么办?你会丢失信息! 例如:
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']}
之类的东西。这是底层实现的功能。
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
答案 10 :(得分:6)
建议改进Javier答案:
dict(zip(d.values(),d))
而不是d.keys()
,你可以只编写d
,因为如果你使用迭代器查看字典,它将返回相关字典的键。
实施例。对于这种行为:
d = {'a':1,'b':2}
for k in d:
k
'a'
'b'
答案 11 :(得分:2)
dict(map(lambda x: x[::-1], YourDict.items()))
.items()
返回(key, value)
元组的列表。 map()
遍历列表的元素,并将lambda x:[::-1]
应用于其元素(元组)以反转它,因此每个元组在新映射中变为(value, key)
,从映射中吐出。最后,dict()
从新列表中生成一个字典。
答案 12 :(得分:2)
通过字典理解可以轻松完成
{d[i]:i for i in d}
答案 13 :(得分:1)
使用循环: -
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
答案 14 :(得分:1)
Hanan的答案是正确的,因为它涵盖了更一般的情况(其他答案对于没有意识到重复情况的人来说是一种误导)。对Hanan答案的一种改进是使用setdefault:
cmpxchg16b
答案 15 :(得分:1)
添加就地解决方案:
>>> 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()
就足够了。
答案 16 :(得分:1)
如果您使用的是Python3,则会略有不同:
res = dict((v,k) for k,v in a.items())
答案 17 :(得分:0)
a = {1: 'one', 2: 'two'}
swapped_a = {value : key for key, value in a.items()}
打印(swapped_a)
输出: {'一':1,'二':2}