当前位置: 首页 > 面试题库 >

从Python字典中的值中查找键:

丁英韶
2023-03-14
问题内容

对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})。)

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



 类似资料:
  • 我很难理解下面的代码是如何在字典中找到最大值的键的。我知道第一个参数返回键列表。但我没有得到第二个参数..帮帮我

  • 问题内容: 我有以下字典 我想获取字典列表中每个字典值“ KA20”和“ KA23”的键“ tmst”的总和。 您能对此提出建议吗? 问题答案: 您可以使用: 请注意,要正常工作,必须按分组键进行排序:

  • 在python中,我有以下输入: 输出-这3个人的所有食物组合: 主要的问题是我不知道每个人的人数和食物的数量,所以我猜这是递归的。

  • 问题内容: 我有很简单的清单: 我如何求和所有 黄金 价值?我正在寻找不错的oneliner。 现在,我正在使用以下代码(但这不是最佳解决方案): 问题答案:

  • 问题内容: 给定一个字典,我想提供一个函数。 有内置功能吗?还是我必须做 理想情况下,我只会写 要么 也就是说,对原始词典进行了突变还是创建副本对我来说都没有关系。 问题答案: 没有这样的功能;最简单的方法是使用dict理解: 在python 2.7中,请使用方法而不是节省内存。dict理解语法直到python 2.7才引入。 注意,列表上也没有这种方法。您将不得不使用列表推导或函数。 这样,您也

  • 问题内容: 我有字典。 如何将的所有值提取到列表中? 问题答案: 如果你只需要字典的键,和使用:。 如果你只需要在字典中的值,和使用:。 如果您想同时使用键和值,请使用:返回一个元组列表。