Прямого маршрута нет.Однако это довольно просто для списочных представлений:
[k for k, v in d.iteritems() if v == desired_value]
Если вам нужно делать это время от времени и не думать, что стоит индексировать его и другим способом, вы можете сделать что-то вроде:
class bidict(dict):
def key_with_value(self, value, default=None):
for k, v in self.iteritems():
if v == value:
return v
return default
def keys_with_value(self, value, default=None):
return [v for k, v in self.iteritems() if v == value]
Тогда d.key_with_value
будет вести себя примерно так же, как d.get
, за исключением обратного пути.
Вы также можете создать класс, который будет индексировать его в обе стороны автоматически.Ключ и значение должны быть хэшируемыми.Вот три способа, которыми это может быть реализовано:
В двух отдельных диктовках с разоблачением некоторых диктовочных методов;Вы могли бы, возможно, сделать foo.by_key[key]
или foo.by_value[value]
.(Код не указан, так как он более сложный, и я ленивый, и я думаю, что это в любом случае неоптимально.)
В другой структуре, чтобы вы могли делать d[key]
и d.inverse[value]
:
class bidict(dict):
def __init__(self, *args, **kwargs):
self.inverse = {}
super(bidict, self).__init__(key, value)
def __setitem__(self, key, value):
super(bidict, self).__setitem__(key, value)
self.inverse[value] = key
def __delitem__(self, key):
del self.inverse[self[key]]
super(bidict, self).__delitem__(key)
В той же структуре, чтобы вы могли сделать d[key]
и d[value]
:
class bidict(dict):
def __setitem__(self, key, value):
super(bidict, self).__setitem__(key, value)
super(bidict, self).__setitem__(value, key)
def __delitem__(self, key):
super(bidict, self).__delitem__(self[key])
super(bidict, self).__delitem__(key)
(Примечательно, что в этих реализациях bidict
отсутствует метод update
, который будет несколько более сложным (но help(dict.update)
покажет, что вам нужно охватить). Без update
, bidict({1:2})
не будетделать то, для чего он предназначен, d.update({1:2})
.)
Также подумайте, будет ли более подходящей какая-либо другая структура данных.