检查字典列表是否包含某个值并返回对应的键

3

我有一个字典,其中包含一组键值对,其中值是一个列表,如下所示:

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()

我该如何解决这个问题,以便返回所有包含此值的列表的键?谢谢

1
那些不是列表,而是由错误信息所暗示的numpy.ndarray对象。不过,无论是list还是numpy.ndarray对象,你都想使用v in value: - juanpa.arrivillaga
3个回答

8
您可以使用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]

2

你很接近了!

dict.items() 返回两个东西:

  • 键(Key)
  • 值(Value)

在这种情况下,值是一个列表。所以本质上你的实现是在做这个:

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语句是多余的,因为[]return的效果是一样的。


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

然后就可以轻松地将其转换为列表推导式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接