2010-03-18 5 views
1

두 개의 중첩 목록과 공통 값에 대한 인덱스의 결합을 가져 오려고합니다.인덱스가있는 중첩 된 목록 2 개를 가진 python 공용체

A가 len(A)와 인덱스 벡터 속한다 저는 두 A = [[1,2,3],[4,5,6],[7,8,9]]B = [[1,2,3,4],[3,3,5,7]] 같은 목록하지만 각 목록의 길이가 약 100 000입니다 있습니다 I = [2,3,4]

내가 원하는 것은 여기서 첫 번째 B의 모든 하위 목록을 발견하는 것입니다 3 개의 요소는 A의 하위 목록과 같습니다.이 예제에서는 B[0]이 반환됩니다 ([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]) 

을하지만 그건 연령을지지 않습니다, 또는 결코

가 그럼 난 AB을 전환 완료 세트에 넣고 양쪽에서 노조를 가져 갔다. 그것은 매우 빨랐다. 그러나 그 다음 나는 대응하는 인덱스를 얻는 방법을 모른다.

누구나 아이디어가 있습니까? -

답변

1

보조 딕셔너리 만들기 (작업 O(len(A)입니다)를 고유하게 식별에 하위 목록의 처음 세 항목을 가정이 (그렇지 않으면 당신은 목록의 DICT 필요) :

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

사용했다 루프 딕셔너리 그럼 답을 생산하기 위해 요청을 받고 있는지 충분히 운동에 대해 수행

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

: 일단 B의 하위 목록과 인덱스를 얻을 (작업 O(len(B))입니다) B에. 제 두뇌는 그가 원하는 것을 이해하려고 애쓰는 것입니다. – MattH

+0

그것은 일하고 superquick! 정말 고맙습니다! – sbas