似乎使用更新应该非常简单,我认为我正确使用它,所以它必须是处理类型或其他东西的错误。
但无论如何,这是坐下来:
我正在为Coursera课程做课程(不用说,答案最小化或阻塞最有用的代码!)并且我坚持最后一个问题。任务是返回一个包含所有包含查询中所有单词的文档的集合。该函数采用inverseIndex,包含单词作为键的字典以及包含这些单词作为值ex的文档:{'a':[0,1],'be':[0,1,4].....}
我尝试实现这一点的方式非常简单:获取一组集合,其中每个集合包含文档ID列表,然后调用.intersections(sets)将集合合并到一个集合中仅包含查询中包含所有单词的文档的文档ID。
def andSearch(inverseIndex, query):
sets = set()
s = set()
for word in query:
s.update(inverseIndex[word])
print(inverseIndex[word])
print s
s.intersection(*sets)
return s
不幸的是,当它只返回索引'3'时,会返回inverseIndex中的所有文档。
终端输出:
[0, 1, 2, 3, 4]
[0, 1, 2, 3]
[0, 1, 2, 3, 4]
[0, 1, 2, 3]
[0, 1, 3, 4]
[2, 3, 4]
set([0, 1, 2, 3, 4])
怎么了?
非常感谢!
sets = []
s = set()
for word in query:
sets.append(inverseIndex[word])
print sets
s.intersection(*sets)
return s
输出:
[[0, 1, 2, 3, 4], [0, 1, 2, 3], [0, 1, 2, 3, 4], [0, 1, 2, 3], [0, 1, 3, 4], [2, 3, 4]]
set([])
logout
答案 0 :(得分:2)
您在循环中使用update
。因此,在每次迭代时,您都会将新页面添加到s
。但是你需要与这些页面相交,因为你需要这些页面,每个页面都包含所有单词(不是“至少一个单词”)。因此,您需要在每次迭代时intersect
而不是更新。
另外,我不明白为什么你需要sets
。
这应该有效:
def andSearch(inverseIndex, query):
return set.intersection(*(set(inverseIndex[word]) for word in query))
这只生成set
s:
>>> [set(ii[word]) for word in query]
[set([0, 1]), set([0, 1, 4])]
然后我只需要调用set.intersection
将它们全部交叉。
关于您的问题更新。
这是因为s
为空。
考虑这个例子:
>>> s = set()
>>> s.intersection([1,2,3],[2,3,4])
set([])
要交叉集,只需使用set.intersection
。但它只接受set作为参数。因此,您应该将页面列表转换为页面集,或者将页面保留为字典中的集合。