我是python中的新手,我想创建一个布尔搜索(信息检索)。这基本上需要获取两个2元组列表,并通过以下方式创建一个新的3元组列表:
1)将列表的交集限制为元组的第一个条目,并
2)在两个列表的交集中添加元组的第二个条目到新的3元组。例如,如果每个列表中都有一个元素包含第一个条目a
,比如说(a,b)
和(a,c)
,那么这些元素应合并为新列表中的(a,b,c)
。
这是一个更好的例子。我有两个这样的元组列表:
search_for_term1 =[(documentID1, term1_frequency),(documentID2, term1_frequency) ]
search_for_term2 =[(documentID1, term2_frequency),(documentID3, term2_frequency) ]
例如:
list1 = [(2, 9), (3, 1), (4, 2), (5, 1), (7, 1), (6, 1), (8, 2)]
list2 = [(10, 1), (2, 1), (4, 1), (6, 5)]
预期产出:
[(documentID2, term1_frequency, term2_frequency), (documentID4, term1_frequency, term2_frequency), ... ]
out : [(2, 9, 1), (4, 2, 1), (6, 1, 5)]
答案 0 :(得分:0)
要获得一个简单的实现,您可以对列表进行排序,然后一起迭代它们以获得具有相同id
的元素,以尝试将您的复杂性保持接近O(N)您应该保留列表总是排序。
例如
list1.sort()
list2.sort()
results = []
try:
iter1 = iter(list1)
iter2 = iter(list2)
i = iter1.next()
j = iter2.next()
while True:
if i[0] == j[0]:
results.append((i[0], i[1], j[1]))
i = iter1.next()
j = iter2.next()
elif i[0] < j[0]:
i = iter1.next()
else:
j = iter2.next()
except StopIteration:
pass
答案 1 :(得分:0)
您需要合并多个列表。这是一个通用的解决方案。
list1 = [(2, 9), (3, 1), (4, 2), (5, 1), (7, 1), (6, 1), (8, 2)]
list2 = [(10, 1), (2, 1), (4, 1), (6, 5)]
zipMerge(list1, list2)
测试...
[(2, 9, 1), (3, 1, None), (4, 2, 1), (5, 1, None), (6, 1, 5), (7, 1, None), (8, 2, None), (10, None, 1)]
返回
{{1}}
答案 2 :(得分:0)
这可以通过简单的列表理解来解决,如下所示:
>>> list1 = [(2, 9), (3, 1), (4, 2), (5, 1), (7, 1), (6, 1), (8, 2)]
>>> list2 = [(10, 1), (2, 1), (4, 1), (6, 5)]
>>> [(x,y,z) for (x,y) in list1 for (xx,z) in list2 if x == xx]
[(2, 9, 1), (4, 2, 1), (6, 1, 5)]