假设有如下字典:
my_map = {'a': 1, 'b': 2}
如何反转该地图以获得以下结果:
inv_map = {1: 'a', 2: 'b'}
假设有如下字典:
my_map = {'a': 1, 'b': 2}
inv_map = {1: 'a', 2: 'b'}
Python 3+:
inv_map = {v: k for k, v in my_map.items()}
Python 2:
inv_map = {v: k for k, v in my_map.iteritems()}
dict((v, k) for k, v in my_map.items())
Python 2:
dict((v, k) for k, v in my_map.iteritems())
iteritems()
输出的顺序可能没有保证,因此可以假定对于非唯一值将分配任意键,以一种在某些条件下明显可重现但通常不是这样的方式。 - Evgeni Sergeeviteritems()
方法,因此这种方法将无法工作;而是使用items()
方法,如接受的答案所示。此外,字典推导会使代码比调用dict
更简洁。 - Mark Amerymy_map
中的值不唯一:
Python 3:inv_map = {}
for k, v in my_map.items():
inv_map[v] = inv_map.get(v, []) + [k]
Python 2:
inv_map = {}
for k, v in my_map.iteritems():
inv_map[v] = inv_map.get(v, []) + [k]
inv_map.get(v, [])
如果已经有列表,则返回已添加的列表,因此赋值不会重置为空列表。但是,使用setdefault
会更好看一些。 - Mark Ameryinv_map.setdefault(v, set()).add(k)
。 - Artyermy_map.items()
代替my_map.iteritems()
。 - apitsch如果您希望保留映射类型(假设它是dict
或dict
子类),可以执行以下操作:
def inverse_mapping(f):
return f.__class__(map(reversed, f.items()))
f.__class__
,因为你已经假设它是一个字典了。我会这样做:dict(map(reversed, f.items()))
。该代码将反转字典中的键值对,并返回一个新的字典。 - bkbillyitems
方法。 - Mr_and_Mrs_D试试这个:
inv_map = dict(zip(my_map.values(), my_map.keys()))
.keys()
和.values()
按相同顺序排列其元素,这使得上述方法可行。)inv_map = dict((my_map[k], k) for k in my_map)
或者使用Python 3.0的字典推导式
inv_map = {my_map[k] : k for k in my_map}
另外一种更加实用的方法:
my_map = { 'a': 1, 'b':2 }
dict(map(reversed, my_map.items()))
filter
和map
应该消失并被纳入列表推导式中,而不是增加更多变体”。 - Brian M. Huntdict
иҪ»жқҫжӣҝжҚўдёәе…¶д»–жҳ е°„зұ»еһӢпјҢдҫӢеҰӮcollections.OrderedDict
жҲ–collections.defaultdict
гҖӮ - Will S我们也可以使用 defaultdict
来反转拥有重复键的字典:
from collections import Counter, defaultdict
def invert_dict(d):
d_inv = defaultdict(list)
for k, v in d.items():
d_inv[v].append(k)
return d_inv
text = 'aaa bbb ccc ddd aaa bbb ccc aaa'
c = Counter(text.split()) # Counter({'aaa': 3, 'bbb': 2, 'ccc': 2, 'ddd': 1})
dict(invert_dict(c)) # {1: ['ddd'], 2: ['bbb', 'ccc'], 3: ['aaa']}
请看这里:
使用
defaultdict
比使用dict.setdefault()
实现相同功能更简单且更快。
dict(d_inv)
可以更好,因为字典比不太标准的 defaultdict
有更广泛的支持。例如,一些序列化程序(如 yaml.safe_dump
)无法序列化默认字典,而它们可以序列化字典。 - Konstantin这是对Robert的回答进行扩展,适用于字典中的值不唯一的情况。
class ReversibleDict(dict):
# Ref: https://dev59.com/iHRB5IYBdhLWcg3w3K8J#13057382/
def reversed(self):
"""
Return a reversed dict, with common values in the original dict
grouped into a list in the returned dict.
Example:
>>> d = ReversibleDict({'a': 3, 'c': 2, 'b': 2, 'e': 3, 'd': 1, 'f': 2})
>>> d.reversed()
{1: ['d'], 2: ['c', 'b', 'f'], 3: ['a', 'e']}
"""
revdict = {}
for k, v in self.items():
revdict.setdefault(v, []).append(k)
return revdict
实现有限制,即您不能使用reversed
两次并得到原始结果。它不是对称的。它经过Python 2.6测试。这里是我用来打印结果字典的用例。
如果您更喜欢使用set
而不是list
,并且可能存在无序应用程序,因此这是有意义的,请改用setdefault(v,set()).add(k)
而不是setdefault(v,[]) .append(k)
。
revdict.setdefault(v, set()).add(k)
。 - muesloset
的好理由。它是适用于此处的内置类型。如果我想查找所有值不为 1
或 2
的键怎么办?那么我只需执行 d.keys() - inv_d[1] - inv_d[2]
(在 Python 3 中)。 - mueslo有很多答案,但如果我们谈论的是一个具有非唯一值的词典,那么并没有找到什么干净的东西。
一个解决方案可能是:
from collections import defaultdict
inv_map = defaultdict(list)
for k, v in my_map.items():
inv_map[v].append(k)
如果初始字典为 my_map = {'c':1, 'd':5, 'a':5, 'b':10}
运行上述代码将会给出如下结果:
{5: ['a', 'd'], 1: ['c'], 10: ['b']}
比如,你有以下字典:
my_dict = {'a': 'fire', 'b': 'ice', 'c': 'fire', 'd': 'water'}
你想以倒置的形式得到它:
inverted_dict = {'fire': ['a', 'c'], 'ice': ['b'], 'water': ['d']}
第一种解决方案。要将字典中的键-值对反转,请使用for
循环方法:
# Use this code to invert dictionaries that have non-unique values
inverted_dict = dict()
for key, value in my_dict.items():
inverted_dict.setdefault(value, list()).append(key)
第二种解决方案。使用字典推导式的方法进行反转:
# Use this code to invert dictionaries that have unique values
inverted_dict = {value: key for key, value in my_dict.items()}
第三种解决方案。使用还原倒置方法(依赖于第二种解决方案):
# Use this code to invert dictionaries that have lists of values
my_dict = {value: key for key in inverted_dict for value in my_map[key]}
my_map
是什么。 - crypdickdictio()
?您是不是想说 dict()
? - Georgy
my_map.items()
也可以使用。 - valentin