如何获取包含查询中所有单词的文档列表? [不是交集]

时间:2012-10-27 15:11:48

标签: python

我正在使用Python。

我有一个查询,有文字。例如,query = [hello,tree,blue]

我为每个单词选择了哪个单词,所以每个单词都有一个列表,每个单词都是一个文档。让我们说:

list_query[0]=[1,4,5]
list_query[1]=[5,8]
list_query[2]=[4,5,8]

所以,我应该得到一个结果= [5]

但是,我不想用交集来做。我需要使用迭代来做,i,j。

hello:
      i
      |
      1    4    5
tree:
      5    8
      |
      j

我必须从i = 0开始,比较list_query [0] [i] == list_query [1] [j],如果是,请将该数字添加到列表中。如果不是,我应该迭代较小数量的两个迭代器,依此类推,使用这些列表与查询的其余元素的交集结果。但亲切的找到了怎么做,这让我很生气。

所以如果有人能帮助我...... 提前谢谢。

2 个答案:

答案 0 :(得分:0)

如果您对代码简单性而不是性能最感兴趣,那么迭代地交叉列表的内容并不太难:

def intersect(query_lists):
    # initialize to first result set
    combined_results = query_lists[0]

    # filter out values missing in any other result set
    for query in query_lists[1:]:
        combined_results = filter(lambda i: i in query, combined_results)

    # turn nested generators into a list
    return list(combined_results)

使用set实例而不是列表会快得多,但如果你使用它们,你可以使用内置的交集方法而不用手动操作。

通过组合列表,对组合结果进行排序,然后扫描以找到与原始列表完全相同的重复值,您也可以实现几乎相同的加速。如果您的输入集中可能存在重复项,则无法使用此功能。

如果您知道输入列表各自已排序,您可以检查它们的第一个值是否完全相同,并拒绝任何小于最大值的值。如果您的子列表没有排序,则可能不值得这样做,因为如果您自己对每个子列表进行排序,您将失去一些性能优势。

答案 1 :(得分:0)

我觉得你已经相当远了。我可以向你展示一个实现,但你已经描述了算法,所以自己实现它应该不难。但也许你对自己的描述没有信心。

让我以缓慢而精确的方式重述您的描述,遗漏我们不需要的有关查询的信息等。我们有两个预先排序的列表,我们希望找到它们的交集。从列表a = [1, 4, 5, 7, 8]b = [5, 8, 9]i=0j=0开始,以及一个空的输出列表out = [],使用一个稍微更全面的示例来调整您的图表我最初会离开图表......

i = 0
a = 1 4 5 7 8

j = 0
b = 5 8 9

首先我们检查它们是否相等。他们不是,所以我们采用a[i]b[j]的最小值。在这种情况下,a[i] == 1b[j] == 5,我们希望增加i

i =   1
a = 1 4 5 7 8

j = 0
b = 5 8 9

完成相同的步骤后,我们再次增加i

i =     2
a = 1 4 5 7 8

j = 0
b = 5 8 9

现在情况有所不同; a[i]b[j]是相同的,因此我们希望将该值附加到输出列表并增加两个值:

i =       3
a = 1 4 5 7 8

j =   1
b = 5 8 9

out = 5

现在我们继续。 a[i] 再次小于b[j] ...

i =         4
a = 1 4 5 7 8

j =   1
b = 5 8 9

价值相同,因此我们将该值添加到out并增加ij ......

i =           5
a = 1 4 5 7 8

j =     2
b = 5 8 9

out = 5 8

但现在我们发现i == len(a)。所以我们知道算法已经终止了。

现在我们需要确定我们需要的变量以及逻辑应该如何工作。我们需要列表a,列出b,索引i,索引j和列表out。我们想要创建一个在i == len(a)j == len(b)时停止的循环,并且在该循环中,我们要测试a[i]b[j]的相等性。如果它们相等,我们会增加ij,并将a[i]追加到out。如果它们不相等,那么我们测试是否a[i] < b[j]。如果是,那么我们增加i;否则,我们增加j

这确定了两个列表之间的交集;现在我们只需要将它应用于第一个和第二个列表,然后将结果应用于第三个列表,然后将结果应用于第四个,依此类推。