【问题标题】:reverse mapping of dictionary with Python [duplicate]用Python进行字典的反向映射[重复]
【发布时间】:2011-03-14 09:12:10
【问题描述】:

可能重复:
Inverse dictionary lookup - Python

如果我有一个名为 ref 的字典,如下所示

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

我可以从“abc”得到“def”

def mapper(from):
    return ref[from]

但是,我怎样才能从“def”到“abc”?

def revmapper(to):
    ??????

【问题讨论】:

    标签: python dictionary


    【解决方案1】:

    如果你经常这样做,你会想要建立一个反向字典:

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

    【讨论】:

    • 要明确一点,这个dict d = {'a':[1, 2, 3]}是不可能的
    • @razpeitia :对于反向字典,这是真的,但它可以与d = {'a':(1,2,3)} 一起使用,如果多个键具有相同的值,它将无法工作......使用低效的方法总是,不幸的是 - 效率低下。
    【解决方案2】:

    你可以制作一个反向字典:

    revdict = dict((v,k) for k,v in ref.items())
    

    然后查找您想要的内容:

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

    请注意,如果两个键映射到相同的值,这将不起作用。

    【讨论】:

    • 为简单起见 +1,尽管在这种情况下 iteritems 会更快。
    • 请记住,.itemsonly method in Python3。速度更快,内存效率更高。
    【解决方案3】:
    dict(map( lambda a:[a[1],a[0]], d.iteritems() ))
    

    【讨论】:

    • 没有理由使用 map+lambda。请参阅其他解决方案,了解如何构建列表推导式或生成器表达式。
    • @aaron:map+lambda不如其他的原因是什么?我假设正在进行一些内部优化,使其与众不同? (k,v)for... 比 map(lambda... 更好吗?
    • 1) 没有函数调用开销。 2) 更容易阅读,尤其是在涉及拆包时。
    • 酷,谢谢。但是关于“没有理由永远使用 map+lambda”,您的意思是仅在这种情况下,还是一般情况下?有什么是“数组语句”不能做到的 map(lambda) 可以吗?
    猜你喜欢
    • 2015-08-07
    • 2017-09-12
    • 2023-01-09
    • 2021-03-14
    • 2016-08-31
    • 2020-10-04
    • 2010-10-03
    • 1970-01-01
    • 2021-11-15
    相关资源
    最近更新 更多