元组列表元组中常见第一个元素的列表

时间:2016-01-01 18:10:44

标签: python list tuples

我是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)] 

3 个答案:

答案 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)]