python - 如何更新集合?

标签 python indexing set

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

但无论如何,这是坐:

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

不幸的是,这会返回 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])

出了什么问题?

非常感谢!


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 中。但是您需要交叉这些页面,因为您需要这些页面,每个页面都包含所有单词(而不是“至少一个单词”)。因此,您需要在每次迭代时进行相交而不是更新。

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

这应该有效:

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

关于python - 如何更新集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17763808/

相关文章:

python - 如何访问字典列表的索引?

python - 根据相似项目的数量有效地对集合进行分组

mysql - 如果我在表中的每一列上放置索引会发生什么

javascript - Julia 集查看器

python - python中的列表列表集

python - 使用 python3 在 vi​​rtualenv 中设置环境卡在 setuptools、pip、wheel

python - 环境 python 脚本,需要使用以前运行的结果

python - 如何添加 <div> 标签而不是 <li>

c# - 在测试期间应该如何处理过时的索引?

sql-server - 为什么聚集索引会在更新未包含在该索引中的字段时更新(Ms SQL)?