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}
为什么会这样?
答案 0 :(得分:4)
每个键只能在字典中出现一次。您可以存储每个键的索引列表:
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]}
修改:正如ecik在评论中指出的那样,您还可以使用defaultdict(set)
(并在循环中使用.add()
代替.append()
。
答案 1 :(得分:2)
当你说
时b[val] = key
和val已经存在,它会覆盖设置,获得你所看到的内容。要获取所有值,必须将原始值映射到键列表,例如
from collections import defaultdict
b = defaultdict(list)
for key, val in a.items():
b[val].append(key)
print b
当我这样做时(python 2.5.1),我得到了
defaultdict(<type 'list'>, {'LinMotion': [2, 3, 4, 5, 6, 7, 8, 10],
'PtpMotion': [0, 1, 9],
'Wait': [11]})
答案 2 :(得分:1)
字典键必须是唯一的。如果你想保留它们,你必须为b[val]
列出每个值,并将值添加到这些列表中。
答案 3 :(得分:0)
也许你想要输出字典中的列表:
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]})