我有一本字典,其中包含:
{'Key': ['File1', 'File2']}
其中key
对应一个单词,files
是包含该单词的文件集。
假设我有一本字典:
{'banana': ['file1.txt', 'file2.txt', 'file3.txt'],
'apple': ['file2.txt', 'file3.txt']}
我的查询是banana apple
。如何以仅返回file2.txt
和file3.txt
?
答案 0 :(得分: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'}
在这里,我们创建了一个生成器表达式,它获取与该单词对应的所有文件并将其转换为集合。然后我们unpack set.intersection
函数上的genereator表达式,它找到所有集合的集合交集。
编辑:如果您的字典值确实已设置,正如您在问题中提到的那样
和文件是设置包含该字词
的文件
然后,解决方案可以更快,因为我们没有将列表转换为集合。您可以跳过它并执行
>>> set.intersection(*(d[word] for word in words.split() if word in d))
{'file2.txt', 'file3.txt'}
重要编辑
如果字典只有banana
且apple
不存在且输入为banana apple
,该怎么办?如果你想在这种情况下返回一个空集,那么你只需稍微修改生成器表达式,就像这个
>>> set.intersection(*(set(d.get(word, set())) for word in words.split()))
{'file2.txt', 'file3.txt'}
这里,如果在字典中找不到密钥,我们使用dict.get
方法返回默认值。所以,如果字典中没有apple
,那么我们返回一个空集,使得结果为空集(因为当你用空集相交任何集时,结果将是一个空集)。 / p>
答案 1 :(得分:3)
迭代查询中的键并将结果汇总到set
:
data = {'banana' : ['file1.txt', 'file2.txt', 'file3.txt'],
'apple' : ['file2.txt', 'file3.txt']}
query = "banana apple"
result = None
for key in (k for k in query.split() if k in data):
if result is None:
result = set(data[key])
else:
result &= set(data[key])
答案 2 :(得分:0)
通过构建给定dict
的镜像或反向映射,这是一种简单的方法。这个反向字典中的键,包含query
中的所有项目,作为它们对应的值将是我们想要的。
d1 = {'banana': ['file1.txt', 'file2.txt', 'file3.txt'],
'apple': ['file2.txt', 'file3.txt']}
d2 = {}
query = 'banana apple'
for (k, lst) in d1.items():
for l in lst:
d2.setdefault(l, []).append(k)
print filter(lambda y: all([x in d2[y] for x in query.split()]), d2.keys())