Skip to main content
 首页 » 编程设计

python之如何更新集合

2024年11月01日30lidabo

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

但无论如何,这是坐:

我正在为 Coursera 类(class)做作业(不用说,答案最小化或遮挡代码最有帮助!)并且我被困在最后一个问题上。任务是返回一个集合,其中包含包含查询中所有单词的所有文档。该函数采用一个 inverseIndex,一个包含单词作为键的字典,以及包含这些单词作为值的文档,例如:{'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 

请您参考如下方法:

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

另外,我根本不明白为什么你需要 sets。

这应该有效:

def andSearch(inverseIndex, query): 
    return set.intersection(*(set(inverseIndex[word]) for word in query)) 

这只会生成 set 的数组:

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