从Python字典中的值中查找键:
对Python来说还算是新手,仍然需要大量的信息。
我所见过的所有关于字典的文档都说明了通过键获取值的各种方法-但我正在寻找一种反之的pythonic方法-通过值获取键。
我知道我可以遍历键并检查它们的值,直到找到要查找的值,然后抓住键,但是我正在寻找直接途径。
回答:
没有直接路线。但是,使用列表理解非常容易。
[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)
(明显地,a的这些实现中缺少bidict
该update
方法,该方法会稍微复杂一些(但help(dict.update)
将指示您需要涵盖的内容)。没有update
,bidict({1:2})
就不会做它打算做的事情,也不会做d.update({1:2})
。)
还考虑其他一些数据结构是否更合适。
以上是 从Python字典中的值中查找键: 的全部内容, 来源链接: utcz.com/qa/400860.html