使用Python进行字典的反向映射

18

可能的重复问题:
Python中的反向字典查找

如果我有一个名为 ref 的字典如下:

ref = {}
ref["abc"] = "def"

我可以从"abc"中获取"def"

def mapper(from):
    return ref[from]

但是,我怎么才能从"def"得到"abc"呢?

def revmapper(to):
    ??????
3个回答

23

如果您经常这样做,您将需要构建一个反向字典:

>>> rev_ref = dict((v,k) for k,v in ref.iteritems())
>>> rev_ref
{'def': 'abc'}

>>> def revmapper(to):
...    return rev_ref[to]
如果它很少见,而且你不在乎效率,那么可以这样做:
>>> def revmapper(to):
...    for k,v in ref.iteritems():
...      if v == to: return k

2
只是为了明确,使用这个字典 d = {'a':[1, 2, 3]} 是不可能的。 - razpeitia
2
@razpeitia:对于反向字典,这是正确的,但它可以使用d = {'a':(1,2,3)},如果多个键具有相同的值,则无法正常工作...不幸的是,使用低效的方法总是低效的。 - Stephen

6
你可以制作一个反向词典:
revdict = dict((v,k) for k,v in ref.items())

接下来查找您想要的内容:

assert revdict["def"] == "abc"

请注意,如果两个键映射到相同的值,则此方法将无法正常工作。

对于简单性而言,+1 更好,尽管在这种情况下 iteritems 会更快。 - AaronAsAChimp
请记住,.items是Python3中唯一的方法。更快,更节省内存。 - erik

2
dict(map( lambda a:[a[1],a[0]], d.iteritems() ))

没有必要使用map+lambda。请查看其他解决方案,了解如何构建列表推导式或生成器表达式。 - habnabit
@aaron:为什么 map+lambda 不如其他方法?我猜测有一些内部优化使它与众不同?(k,v)for... 比 map(lambda...) 更好在哪里? - eruciform
  1. 没有函数调用开销。
  2. 阅读起来要容易得多,特别是当涉及到解包时。
- habnabit
很酷,谢谢。但是关于“没有理由使用map+lambda”,您是指只在这种情况下,还是一般情况下都是如此?有什么“数组语句”无法做到而map(lambda)可以吗? - eruciform

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接