обратное отображение словаря с помощью Python [duplicate]

17

Если у меня есть словарь с именем ref, как указано ниже

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

Я могу получить «def» от «abc»

def mapper(from):
    return ref[from]

Но как я могу получить от «def» до «abc»?

def revmapper(to):
    ??????
    
задан prosseek 11.07.2010 в 03:17
источник

3 ответа

22

Если вы делаете это часто, вам нужно создать обратный словарь:

>>> 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
    
ответ дан Stephen 11.07.2010 в 03:25
  • Чтобы быть ясным, это было бы невозможно с этим dict d = {'a': [1, 2, 3]} –  razpeitia 11.07.2010 в 03:55
  • @razpeitia: для обратного словаря это верно, но это будет работать с d = {'a' :( 1,2,3)}, и это не сработает, если несколько ключей имеют одинаковые значения. использование неэффективного метода всегда, к сожалению, неэффективно. –  Stephen 11.07.2010 в 04:03
5

Вы можете сделать обратный словарь:

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

затем посмотрите, что вы хотите:

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

Обратите внимание, что это не сработает, если две клавиши соответствуют одному значению.

    
ответ дан Ned Batchelder 11.07.2010 в 03:24
  • +1 для простоты, хотя в этом случае итеративы будут быстрее. –  AaronAsAChimp 11.03.2013 в 21:47
  • Помните, что .items - единственный метод в Python3. Быстрее и эффективнее память. –  erik 24.04.2016 в 00:30
2
dict(map( lambda a:[a[1],a[0]], d.iteritems() ))
    
ответ дан eruciform 11.07.2010 в 03:30
  • Нет причин использовать карту + лямбду когда-либо. См. Другие решения, как построить понимание списка или генератор выражения. –  habnabit 11.07.2010 в 04:42
  • @aaron: в чем причина того, что карта + лямбда уступает другим? Я предполагаю, что происходит внутренняя оптимизация, что делает ее другой? как (k, v) для ... лучше, чем карта (лямбда ...? –  eruciform 11.07.2010 в 19:05
  • 1) нет служебных вызовов функций. 2) многое, гораздо легче читать, особенно когда есть распаковка. –  habnabit 11.07.2010 в 23:30
  • круто, спасибо. но в отношении «нет причин использовать карту + лямбда когда-либо», вы имеете в виду только в этом случае, или это общий случай? есть ли что-либо, что «инструкция для массива» не может сделать эту карту (лямбда)? –  eruciform 11.07.2010 в 23:35