如何更新一套?

时间:2013-07-20 15:32:36

标签: python indexing set

似乎使用更新应该非常简单,我认为我正确使用它,所以它必须是处理类型或其他东西的错误。

但无论如何,这是坐下来:

我正在为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

1 个答案:

答案 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作为参数。因此,您应该将页面列表转换为页面集,或者将页面保留为字典中的集合。