如何为特定键返回字典值的常用值?

san*_*and 3 python dictionary

我有一本字典,其中包含:

{'Key': ['File1', 'File2']}
Run Code Online (Sandbox Code Playgroud)

where key对应于单词,files是包含该单词的文件集.

假设我有一本字典:

{'banana': ['file1.txt', 'file2.txt', 'file3.txt'],
 'apple': ['file2.txt', 'file3.txt']}
Run Code Online (Sandbox Code Playgroud)

我的查询是banana apple.我怎么比较,我只返回这样价值观file2.txtfile3.txt

the*_*eye 7

您可以使用它set.intersection来创建公共元素,就像这样

>>> d = {'banana': ['file1.txt', 'file2.txt', 'file3.txt'],
...      'apple': ['file2.txt', 'file3.txt']}
>>> words = 'banana apple'
>>> set.intersection(*(set(d[word]) for word in words.split() if word in d))
{'file2.txt', 'file3.txt'}
Run Code Online (Sandbox Code Playgroud)

在这里,我们创建一个生成器表达式,它获取与该单词对应的所有文件并将其转换为集合.然后我们在函数上解包 genereator表达式set.intersection,找到所有集合的集合交集.

编辑:如果您的字典值确实设置了,正如您在问题中提到的那样

和文件是包含该单词的文件

那么,解决方案可以更快,因为我们没有将列表转换为集合.你可以简单地跳过它并做

>>> set.intersection(*(d[word] for word in words.split() if word in d))
{'file2.txt', 'file3.txt'}
Run Code Online (Sandbox Code Playgroud)

重要编辑

如果字典只有bananaapple不存在而且输入是banana apple什么呢?如果你想在这种情况下返回一个空集,那么你只需稍微修改生成器表达式,就像这样

>>> set.intersection(*(set(d.get(word, set())) for word in words.split()))
{'file2.txt', 'file3.txt'}
Run Code Online (Sandbox Code Playgroud)

在这里,dict.get如果在字典中找不到键,我们使用方法返回默认值.所以,如果apple字典中没有,那么我们返回一个空集,使得结果为空集(因为当你用空集相交任何集时,结果将是一个空集).