Я новичок в Python и хочу создать логический поиск (получение информации). Это в основном влечет за собой взятие двух списков из двух кортежей и создание нового списка из трех кортежей с помощью:

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

kim

Ответов: 3

Ответы (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

Это можно решить простым пониманием списка следующим образом:

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

Вам необходимо объединить несколько списков. Вот общее решение.

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

Для проверки ...

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

2022 WebDevInsider