【问题标题】:Returning key of value found in dictionary using 'value in dict.values()'使用'dict.values()中的值'返回在字典中找到的值的键
【发布时间】:2015-11-22 07:37:20
【问题描述】:

有没有办法使用以下方法返回在字典中找到的匹配项的键:

if val in dict.values():
# print the key of the value in the dictionary that matches val

在查找三种不同类型的值时,我尝试使用相同的搜索功能。一个是字母数字,另一个是字符串,第三个是数字。在搜索功能中,我调用了上面的代码。在这个函数中,我搜索包含这些值的已知集合的字典(这三个组合在一起),尝试将从文件中读取的各个值与字典中的这些已知集合进行匹配。我有一个搜索顺序(字母数字、字符串、数字)。字母数字和数字条目是一对一的,但已知字典中的字符串条目是一个列表。我一直假设dict.iteritems() 不会在字符串列表中搜索未知字符串,但val in dict.values() 会。因此使用后者。

根据哪些匹配项(字母数字不匹配,但数字匹配等),我想返回密钥以了解传入数据如何与已知集合匹配。

因此,我没有为每种键类型编写两个或三个单独的函数,而是尝试使用棘手的字典代码将其保持为一个。

编辑:

所以,假设我有这本字典:

dict = {'alphaNumeric':'A7', 'number':'36', 'string':['red','green','blue']}

以及这些不完整的值集来搜索它:

sets = [['A7','',''],[['','36',''], ['','','green']]

我试图设计处理任何搜索的功能:

def searchFun(sets, dict):
    for set in sets:
        for val in sets:
            if val in dict.values():
                return val, #KEY WHERE IT WAS FOUND#

【问题讨论】:

  • 不能保证存在“the”键这样的东西,因为多个键可能具有相同的值。在这种情况下你想发生什么?
  • 我的字典和更大功能的设置方式,重复是不可能的。如果找到该值,它将仅与一个键关联。
  • 请记住,使用值来查找键与字典的工作方式相反。你可能有一个XY Problem
  • 是的,它仍然如此。

标签: python dictionary


【解决方案1】:

您正在向后使用字典。如果你把它们安排在另一个方向,你会更轻松:

my_dict = {'A7':'alphaNumeric', '36':'number', 'red':'string', 'green':'string', 'blue':'string'}
my_queries = ['A7', '', '', '', '36', '', '', '', 'green']

请注意,您的查询列表是一个不规则的多维list,应该被展平(the top answer in this question 中有一个很好的方法 - 如果需要,您可以调整它以适应您的 Python 版本)。我已将其硬编码为平面 list 以演示查找功能。

现在你可以使用干净简洁的函数了:

def searchfun(d, queries):
    return [(key,d[key]) for key in queries if key in d]

结果如下:

>>> searchfun(my_dict, my_queries)
[('A7', 'alphaNumeric'), ('36', 'number'), ('green', 'string')]

还请注意,这类似于 OOP,每个对象都有一个可能被称为 self.classification 之类的属性。

【讨论】:

  • 哇。这真的很有趣。如果我向后使用它们,还有很多其他的吗?可能似乎遵循属性:值,而不是值:属性。例如,此站点:tutorialspoint.com/python/python_dictionary.htm,建议使用属性:值。而且我觉得我和很多人一样。
  • @traggatmot - 您必须根据具体情况对其进行评估,但通常您应该考虑您拥有哪些信息以及您拥有哪些信息想要,然后往那个方向走。为一堆值/对象查找某个属性? value:attribute。查找所有具有特定属性的值? attribute:[value1, value2].
【解决方案2】:

字典经过优化以查找键。没有好的方法可以通过价值进行查找。你只需要迭代它。

for k, v in dict.iteritems():
    if val == v:
        print k

【讨论】:

  • 列表只有在它们的顺序相同时才比较为True。如果需要比较可能有不同顺序的列表,可以使用 set(val) == set(v)。一个陷阱:它将消除比较中的任何重复项。
【解决方案3】:

不,没有。正如@Laizer 建议的那样,您可以在python3 中使用.iteritems(或.items()。但是您不能使用.values() 来执行此操作。但是您可以返回一个 具有该值的键:

if val in dict.values():
    for k in dict.keys(): # of just `for x in dict:`
        if val == dict[k]:
             print k

【讨论】:

  • 当其中一个值是字符串列表时,这会如何变化?
  • 它根本不应该改变,只要列表匹配,它们就匹配。
  • 你误会了。对不起,我的解释很糟糕。如果我有一个未知的字符串被读入,我将它与字典的一部分(字符串部分)进行比较,其中值是一个列表 - 它不是列表到列表的比较,而是尝试查看字符串(如果是读入的数据)在列表中。
【解决方案4】:

没有直接的方法可以根据值来识别键,因为多个键可以具有相同的值,例如

mydict = {'orange': 0, 'red': 1, 'yellow': 2, 'black': 0}
print mydict.keys()[mydict.values().index(0)]

这将为您返回第一个出现值 0 键,即 'orange'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    • 2023-02-14
    • 2021-06-28
    • 1970-01-01
    • 2013-05-11
    相关资源
    最近更新 更多