从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的这些实现中缺少bidictupdate方法,该方法会稍微复杂一些(但help(dict.update)将指示您需要涵盖的内容)。没有updatebidict({1:2})就不会做它打算做的事情,也不会做d.update({1:2})。)

还考虑其他一些数据结构是否更合适。

以上是 从Python字典中的值中查找键: 的全部内容, 来源链接: utcz.com/qa/400860.html

回到顶部