我有一本字典,其中包含:
{'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.txt和file3.txt?
您可以使用它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)
重要编辑
如果字典只有banana和apple不存在而且输入是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字典中没有,那么我们返回一个空集,使得结果为空集(因为当你用空集相交任何集时,结果将是一个空集).