我有一个包含一组键:值对的字典,其值是这样的列表:
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()
如何解决此问题以返回列表中包含此值的所有键?感谢
答案 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
...然后很容易转向列表理解。