没有直接路线。但是,使用列表理解非常容易。
[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] = keydef __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)
(明显地,a的这些实现中缺少
bidict该
update方法,该方法会稍微复杂一些(但
help(dict.update)将指示您需要涵盖的内容)。没有
update,
bidict({1:2})就不会做它打算做的事情,也不会做d.update({1:2})。)还考虑其他一些数据结构是否更合适。



