元组列表的元组中公共第一个元素的列表

2024-04-27 16:41:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我是python的新手,我想创建一个布尔搜索(信息检索)。这基本上需要获取两个2元组的列表,并通过以下方式创建一个新的3元组列表:

1)取限制在元组第一个条目的列表的交集,以及

2)将交集中元组的第二个条目从两个列表添加到新的3元组。例如,如果每个列表中都有一个元素的第一个条目a,比如说(a,b)和{},那么这些元素应该合并成新列表中的(a,b,c)。在

这里有一个更好的例子。我有两个这样的元组列表:

search_for_term1 =[(documentID1, term1_frequency),(documentID2, term1_frequency) ] 

search_for_term2 =[(documentID1, term2_frequency),(documentID3, term2_frequency) ] 

例如:

^{pr2}$

预期产量:

[(documentID2, term1_frequency, term2_frequency), (documentID4, term1_frequency, term2_frequency), ... ]

out : [(2, 9, 1), (4, 2, 1), (6, 1, 5)] 

Tags: term1目的元素列表forsearch方式条目
3条回答

为了得到一个简单的实现,你可以对列表进行排序,然后在它们之间进行迭代,得到那些具有相同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

你需要把这几个清单合并起来。这是一个通用的解决方案。在

def zipMerge(*lists):
    dicts = map(dict, lists)
    base = { }
    items = 0
    for d in dicts:
        items += 1
        for k,v in d.iteritems():
            if k not in base:
                base[k] = [k] + [None] * len(lists)
            base[k][items] = v

    return map(tuple, sorted(base.itervalues()))

为了测试。。。在

^{pr2}$

退货

[(2, 9, 1), (3, 1, None), (4, 2, 1), (5, 1, None), (6, 1, 5), (7, 1, None), (8, 2, None), (10, None, 1)]

这可以通过以下简单的列表理解来解决:

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

相关问题 更多 >