我正在使用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],如果是,请将该数字添加到列表中。如果不是,我应该迭代较小数量的两个迭代器,依此类推,使用这些列表与查询的其余元素的交集结果。但亲切的找到了怎么做,这让我很生气。
所以如果有人能帮助我...... 提前谢谢。
答案 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=0
和j=0
开始,以及一个空的输出列表out = []
,使用一个稍微更全面的示例来调整您的图表我最初会离开图表......
i = 0
a = 1 4 5 7 8
j = 0
b = 5 8 9
首先我们检查它们是否相等。他们不是,所以我们采用a[i]
和b[j]
的最小值。在这种情况下,a[i] == 1
和b[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
并增加i
和j
......
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]
的相等性。如果它们相等,我们会增加i
和j
,并将a[i]
追加到out
。如果它们不相等,那么我们测试是否a[i] < b[j]
。如果是,那么我们增加i
;否则,我们增加j
。
这确定了两个列表之间的交集;现在我们只需要将它应用于第一个和第二个列表,然后将结果应用于第三个列表,然后将结果应用于第四个,依此类推。