Python 如何更新集合?

Python 如何更新集合?,python,indexing,set,Python,Indexing,Set,似乎使用update应该是非常直接的,我认为我使用它是正确的,所以它一定是处理类型或其他方面的错误 但不管怎么说,这就是问题所在: 我正在为一门Coursera课程做功课(不用说,答案最小化或屏蔽代码最有帮助!),我被最后一个问题困住了。任务是返回一个集合,其中包含包含查询中所有单词的所有文档。该函数使用inverseIndex,一个包含单词作为键的字典,以及包含这些单词的文档作为值,例如:{'a':[0,1],'be':[0,1,4]…} 我试图实现这一点的方法非常简单:获取一组集合,其中每个

似乎使用update应该是非常直接的,我认为我使用它是正确的,所以它一定是处理类型或其他方面的错误

但不管怎么说,这就是问题所在:

我正在为一门Coursera课程做功课(不用说,答案最小化或屏蔽代码最有帮助!),我被最后一个问题困住了。任务是返回一个集合,其中包含包含查询中所有单词的所有文档。该函数使用inverseIndex,一个包含单词作为键的字典,以及包含这些单词的文档作为值,例如:
{'a':[0,1],'be':[0,1,4]…}

我试图实现这一点的方法非常简单:获取一组集合,其中每个集合都包含文档ID列表,然后调用.crossions(集合)将集合合并到一个集合中,该集合只包含包含查询中所有单词的文档的文档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
不幸的是,这将返回inverseIndex中的所有文档,而它应该只返回索引“3”

终端输出:

[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])
怎么了

非常感谢


输出:

[[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

在循环中使用
update
。因此,在每次迭代中,您都会将新页面添加到
s
。但是您需要将这些页面相交,因为您需要这些页面,每个页面都包含所有单词(而不是“至少一个单词”)。因此,您需要在每次迭代中进行交集,而不是更新

而且,我根本不明白为什么需要
集合

这应该起作用:

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
。但它只接受集作为参数。因此,您应该将页面列表转换为页面集,或者将页面作为集合保留在字典中。

集合
似乎是空的,您应该每次都向其中添加您的小集合。Getting:attributeError:set没有属性intersect。我明白了,我想知道为什么我一直使用的方法不起作用。你显然已经回答了我的帖子,但是你能解释一下为什么我在原始问题底部发布的代码不起作用吗?你正在使用
update
。所以集合中的元素不是相交的,而是相加的。尝试在解释器中执行这一行以理解
s=set([0,1]);s、 更新([5,6,7]);打印s
。因此,最终你拥有至少存在一个单词的所有页面(就像这个单词在这个页面中一样,它将被添加到结果集中)。@goldisfine啊,我看到了问题的更新。我很快会更新我的答案。@goldisfine我喜欢教书。我的很多朋友都愿意接受教育。但这个网站确实吸引了那些愿意学习和愿意解释的人。解释这件事真是太高兴了!
>>> s = set()
>>> s.intersection([1,2,3],[2,3,4])
set([])