Swap keys for unique values in a dictionary in Python

匿名 (未验证) 提交于 2019-12-03 02:38:01

问题:

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 

What I am trying to do is to swap value of the dictionary for key. But using this code, I lose some information of the dictionary, getting this output:

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

Why does it happen?

回答1:

Each key can only occur once in a dictionary. You could store a list of indices for each key:

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]} 

Edit: As pointed out by ecik in the comments, you could also use a defaultdict(set) (and use .add() instead of .append() in the loop).



回答2:

When you say

b[val] = key 

and val already exists,it overrides the setting, getting what you see. To get all values, you must map the original values to lists of keys, such as

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

When I do it (python 2.5.1), I get

defaultdict(<type 'list'>, {'LinMotion': [2, 3, 4, 5, 6, 7, 8, 10],                              'PtpMotion': [0, 1, 9],                              'Wait': [11]}) 


回答3:

Dictionary keys must be unique. If you wanted to keep them all you'd have to make each value for b[val] a list and add the values to those lists.



回答4:

Perhaps you want lists in the output dictionary:

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 

yields:

defaultdict(<type 'list'>, {'LinMotion': [2, 3, 4, 5, 6, 7, 8, 10], 'PtpMotion': [0, 1, 9], 'Wait': [11]}) 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!