检查字典列表是否包含值和返回键

时间:2018-02-13 23:01:35

标签: python dictionary key-value

我有一个包含一组键:值对的字典,其值是这样的列表:

my_dict = {7: [6, 13], 6: [7, 8, 9, 11, 13, 14], 8: [6, 14], 9: [6], 11: [6], 13: [6, 7], 14: [6, 8]}

我想检查哪些列表包含值' 6'并返回与匹配对应的键。 (即7,8,9,11,13和14)

我尝试过以下代码:

def find_key_for(input_dict, value):    
    for k, v in input_dict.items():
        if v == value:
            yield k
        else:
            return "None"

keys = list(find_key_for(my_dict, 6))

但它返回以下错误:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

如何解决此问题以返回列表中包含此值的所有键?感谢

3 个答案:

答案 0 :(得分:5)

您可以使用dict.items()

my_dict = {7: [6, 13], 6: [7, 8, 9, 11, 13, 14], 8: [6, 14], 9: [6], 11: [6], 13: [6, 7], 14: [6, 8]}
new_dict = [a for a, b in my_dict.items() if 6 in b]

输出:

[7, 8, 9, 11, 13, 14]

答案 1 :(得分:2)

你很亲密!

dict.items()会返回两件事:

  • 关键

在这个例子中,值是一个列表。所以基本上你的实现是这样做的:

6 == [6, 14]

这就是为什么你每次都会得到一个空列表。对于简短的惯用代码,请给出@ Ajax1234给出的答案。但是,如果要防止列表和整数,请执行以下操作:

def find_key_for(input_dict, value):    
for k, v in input_dict.items():
    if value in v or value == v:
        yield k

我还想注意,您不应该在生成器中使用return。这个return语句是多余的,因为[]是同一个东西

答案 2 :(得分:1)

在原始代码中,我认为if行应为:

    if value in v:

另外我不确定发电机在这里特别有用,因为它提供的懒惰会立即被list()电话中的呼叫取消。人们可以这样做:

def find_key_for(input_dict, value):    
    result = []
    for k, v in input_dict.items():
        if value in v:
            result.append(k)
    return result

...然后很容易转向列表理解。