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

时间:2009-06-23 10:53:13

标签: python dictionary

我收到一个字典作为输入,并希望返回一个字典,其键将是输入的值,其值将是相应的输入键。价值观是独一无二的。

例如,我的输入是:

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

我希望我的输出为:

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

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

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

任何巧妙的Python方式来实现这个目标吗?

由于

18 个答案:

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

请注意,如果

,您无法“反转”字典
  1. 多个密钥共享相同的值。例如{'one':1,'two':1}。新词典只能有一个键为1的项目。
  2. 一个或多个值不可删除。例如{'one':[1]}[1]是有效值,但不是有效密钥。
  3. 有关该主题的讨论,请参阅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}