在Python中为字典中的唯一值交换键

在Python中为字典中的唯一值交换键,python,dictionary,Python,Dictionary,我试图做的是用字典的值交换键。但是使用这段代码,我丢失了字典的一些信息,得到了以下输出: a = {0: 'PtpMotion', 1: 'PtpMotion', 2: 'LinMotion', 3: 'LinMotion', 4: 'LinMotion', 5: 'LinMotion', 6: 'LinMotion', 7: 'LinMotion', 8: 'LinMotion', 9: 'PtpMotion', 10: 'LinMotion', 11: 'Wait'} b = {} for

我试图做的是用字典的值交换键。但是使用这段代码,我丢失了字典的一些信息,得到了以下输出:

a = {0: 'PtpMotion', 1: 'PtpMotion', 2: 'LinMotion', 3: 'LinMotion', 4: 'LinMotion', 5: 'LinMotion', 6: 'LinMotion', 7: 'LinMotion', 8: 'LinMotion', 9: 'PtpMotion', 10: 'LinMotion', 11: 'Wait'}
b = {}
for key, val in a.items():
    b[val] = key
print b

为什么会这样

每个键在字典中只能出现一次。您可以存储每个键的索引列表:

{'LinMotion': 10, 'PtpMotion': 9, 'Wait': 11}

编辑:正如ecik在评论中指出的,您也可以使用defaultdictset,并在循环中使用.add而不是.append。

字典键必须是唯一的。如果您想保留所有值,则必须将b[val]的每个值都列为一个列表,并将这些值添加到这些列表中。

也许您想要输出字典中的列表:

import collections
b = collections.defaultdict(list)
for key, val in a.iteritems():
    b[val].append(key)
print b
# {'LinMotion': [2, 3, 4, 5, 6, 7, 8, 10], 'PtpMotion': [0, 1, 9], 'Wait': [11]}
收益率:

from collections import defaultdict
a = {0: 'PtpMotion', 1: 'PtpMotion', 2: 'LinMotion', 3: 'LinMotion', 4: 'LinMotion', 5: 'LinMotion', 6: 'LinMotion', 7: 'LinMotion', 8: 'LinMotion', 9: 'PtpMotion', 10: 'LinMotion', 11: 'Wait'}
b = defaultdict(list)
for key, val in a.items():
    b[val].append(key)
print b
当你说

defaultdict(<type 'list'>, {'LinMotion': [2, 3, 4, 5, 6, 7, 8, 10], 'PtpMotion': [0, 1, 9], 'Wait': [11]})
val已经存在,它覆盖设置,获取您看到的内容。要获取所有值,必须将原始值映射到键列表,例如

b[val] = key
当我使用python 2.5.1时,我得到

from collections import defaultdict

b = defaultdict(list)
for key, val in a.items():
    b[val].append(key)
print b

最好将其存储为一个集合,而不是一个列表,因为很明显,其中的所有值都是唯一的。@ecik:谢谢,答案中包含了……那么您希望得到什么结果呢?
defaultdict(<type 'list'>, {'LinMotion': [2, 3, 4, 5, 6, 7, 8, 10], 
                            'PtpMotion': [0, 1, 9], 
                            'Wait': [11]})