检查一个单词是否在字典值为列表的键中

3
我将尝试检查一个单词是否在字典的值列表中。例如,我想检查'noodles'是否存在于以下列表中:{1:['hello', 'hallo', 'salut', 'ciao', 'hola'], 2:['eggs', 'noodles', 'bacon']}
我尝试使用以下代码:
element = 'noodles'
element in myDict.values()

但我得到的是:False

2
“values” 在这种情况下将返回一个列表的列表,对吗?您可能需要检查每个子列表。在这里,“any”可能会有用。 - Carcigenicate
你提到了一个列表,但我在你的代码中没有看到列表。 - Arete
9个回答

3

您的代码检查字典中是否存在element'noodles'),但该值不存在(这些值是列表)。

您需要检查element是否在每个列表中。

如果您不关心键:

print(any(element in value for value in myDict.values()))

如果您想知道关键字(这将打印出匹配的关键字列表):
print([key for key, value in myDict.items() if element in value])

但是,一般来说,如果你发现自己不得不一遍又一遍地遍历一个字典,那么你要么选择了错误的键,要么使用了错误的数据结构。


我更喜欢next((key for key, value in myDict.items() if element in value),"KEY_NOT_FOUND")。但是好的答案是(是的,字典中的线性搜索清楚地表明数据组织存在问题)。 - Jean-François Fabre

1
这里的dict.values()调用返回一个列表的可迭代对象。你需要先将返回的可迭代对象展开才能进行直接测试:
from itertools import chain

element = 'noodles'
print(element in chain.from_iterable(my_dict.values())) # -> True

1

在这里应该使用一个函数,你可以使用纯Python来完成,而不需要导入任何模块或使其更加复杂:

数据:

Your_dict={1:['hello', 'hallo', 'salut', 'ciao', 'hola'], 2:['eggs', 'noodles', 'bacon']}
your_word='noodles'

代码:

def find(dict_1,word):
    for words in dict_1.values():
        if word in words:
            return True
    else:
        return False




print(find(Your_dict,your_word))

输出:

True

一行代码的解决方案,不需要任何循环或模块:

只是为了好玩

print(list(map(lambda x:x if your_word in x else None,Your_dict.values())))

输出:

[None, ['eggs', 'noodles', 'bacon']]

1
myDict = {1: ['hello', 'hallo', 'salut', 'ciao', 'hola'], 2: ['eggs', 'noodles', 'bacon']}
element = 'noodles'
[print(True) if element in value else None for value in myDict.values()]

# It will give true if it is present

1
您可以在生成器表达式上使用 any()
any("noodles" in v for v in d.values())

在这种情况下,它的翻译是:“which”,即“给出:”。
True

为什么?

因为d.values()返回字典d中所有值的一个可迭代对象。所以在这种情况下,d.values()的结果将是:

dict_values([['hello', 'hallo', 'salut', 'ciao', 'hola'], ['eggs', 'noodles', 'bacon']])

我们随后检查了这些值(列表)中是否有字符串"noodles"。这非常容易/易读。我们只需创建一个生成器,确切地完成这个工作 - 即为每个值返回一个布尔值,指示该列表中是否存在"noodles"。然后,由于我们现在有了一个生成器,我们可以使用any(),它将仅为整个生成器返回一个布尔值,指示在迭代时是否有任何Trues。因此,在我们的情况下,这意味着"noodles"是否出现在任何values中。

1
你应该使用循环。这肯定会起作用。这是经过测试的代码。
element = 'noodles'
for i in dict1.values():
    if(element in i):
        print(True)
        count+=1
print(count)

Count会计算你的元素出现的次数。如果为0,则该元素不在字典的值中可用;如果大于0,则在字典的值中可用。Count仅供参考。


1
你可以使用 dict.items():
s = {1:['hello', 'hallo', 'salut', 'ciao', 'hola'], 2:['eggs', 'noodles', 'bacon']}
element = 'noodles'
if any(element in b for a, b in s.items()):
   pass

0

myDict.values() 会返回一个列表的列表,而不是你可以在其中询问 x 是否在 y 中的东西,你将无法避免使用类似于 Python search in lists of lists 的循环。

...除非你觉得这太费时间了,决定保留某种哈希来包含 myDict.values 中包含的所有列表中的元素。请注意,这将对每个插入到字典中的 l 都需要 O(len(l)) 的时间复杂度。


0
在我的情况下,我需要检查单词是否存在于键或值中,这里有一个简单的解决方案。(它可能会帮助某些人)
if 'noodle' in str(myDict):
    True
else:
    False

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