объединение двух вложенных списков в Python с индексом - PullRequest
1 голос
/ 18 марта 2010

Я хочу получить объединение из 2 вложенных списков плюс индекс для общих значений.

У меня есть два списка, например A = [[1,2,3],[4,5,6],[7,8,9]] и B = [[1,2,3,4],[3,3,5,7]], но длина каждого списка составляет около 100 000. А принадлежит индексный вектор с len(A): I = [2,3,4]

Я хочу найти все подсписки в B, где первые 3 элемента равны подсписку в A. В этом примере я хочу получить B[0] return ([1,2,3,4]), потому что его первые три элемента равны A[0]. Кроме того, я также хочу, чтобы в этом примере индекс составлял A[0], то есть I[0].

Я пробовал разные вещи, но пока ничего не получалось: (

Сначала я попробовал это:

Common = []

for i in range(len(B)):

   if B[i][:3] in A:

      id = [I[x] for x,y in enumerate(A) if y == B[i][:3]][0]
         ctdCommon.append([int(id)] + B[i])   

Но это занимает много времени или никогда не заканчивается

Затем я преобразовал A и B в наборы и взял объединение из обоих, что было очень быстро, но потом я не знаю, как получить соответствующие индексы

У кого-нибудь есть идея?

1 Ответ

1 голос
/ 18 марта 2010

Создайте вспомогательный диктант (работа O(len(A)) - при условии, что первые три элемента подсписка в A однозначно идентифицируют его (в противном случае вам нужен набор списков):

aud = dict((tuple(a[:3]), i) for i, a in enumerate(A))

Используйте указанный dict для однократного зацикливания на B (работа O(len(B))), чтобы получить подсписки B и индексы A:

result = [(b, aud[tuple(b[:3])]) for b in B if tuple(b[:3]) in aud]
...