2013-07-26 2 views
0

튜플 목록의 항목을 중첩 목록의 항목과 비교하고 튜플 및 중첩 목록의 항목으로 목록을 반환해야합니다.Python : 튜플 목록과 중첩 목록에서 일치 항목을 비교하고 찾습니다.

입력 데이터 :

data1 = [('Name1', {'code':['12345']}), 
     ('Name2', {'code':['78901']})] 

data2 = [['12345', '123456', 'name1'], 
     ['78901', '789012', 'name2'], 
     ['34567', '345678', 'name3']] 

내가 그 일을 더 쉽게 만드는 경우 데이터 2의 중첩 된 목록 형식에 맞게 입력 DATA1 변환에는 문제가 없습니다. 기본적으로 data1[x][1]['code'][0] to data2[x][0]

을 비교

data3 = [['Name1', '123456', 'name1'] 
     ['Name2', '789012', 'name2']] 

내가 지금까지 가지고 무엇하지만 난 그게 맞아 잘 모르겠어요 :

내가 필요한 것은 무엇인가처럼

data3 = [] 
for i in range(len(data2)): 
    if data1[i][1]['code'][0] in [data2][i][0]: 
     data3.append([data1[i][0], data2[i][1], data2[i][2]]) 

이 수익을 IndexError : 목록 색인이 범위를 벗어났습니다.

미리 감사드립니다.

답변

0

귀하의 데이터 2 목록에 더 이상 데이터 1보다 당신이 DATA1을 반복 데이터 2의 길이는 인덱스보다 많습니다. if 문에 괄호로 묶인 [data2] 오류가있었습니다.

고정 원래 코드 : 목록 바로 위에 반복에 의해 단순화

data3 = [] 
for i in range(len(data1)): 
    for j in range(len(data2)): 
     if data1[i][1]['code'][0] in data2[j][0]: 
      data3.append([data1[i][0], data2[j][1], data2[j][2]]) 

:

data3 = [] 
for i in data1: 
    for j in data2: 
     if i[1]['code'][0] in j[0]: 
      data3.append([i[0], j[1], j[2]]) 
+0

단순화 된 버전은 이해하기 쉬웠다와 완벽하게 작동합니다. – sergei

2

data1의 역 매핑 만들기 :

inverse_data1 = {v['code'][0]: k for k, v in data1} 

이제 나머지는 훨씬 간단합니다; 당신은 역 매핑에 대한 코드를보고 O (1) 시간에 해당 이름을 찾을 수 있습니다

data3 = [[inverse_data1[d[0]]] + d[1:] for d in data2 if d[0] in inverse_data1] 

데모 :

>>> inverse_data1 = {v['code'][0]: k for k, v in data1} 
>>> [[inverse_data1[d[0]]] + d[1:] for d in data2 if d[0] in inverse_data1] 
[['Name1', '123456', 'name1'], ['Name2', '789012', 'name2']] 

는 일반적으로 range(len(somelist)) 위에 있지 루프를 수행 말할 때 당신이 할 수있는 단지 루프 그 목록에 직접. enumerate() 함수를 사용하여 다른 용도로 필요하면 색인을 추가 할 수 있습니다. data1data2 목록의 길이가 같지 않으므로 하나의 색인에서 다른 색인을 사용할 수 없습니다.

중첩 루프를 필요로 당신의 접근 방식 (매우 비효율적, 당신은 지금 data1의 모든 항목에 대한 data2의 전체에 걸쳐 반복된다)

:

data3 = [] 
for d1 in data1: 
    for d2 in data2: 
     if d1[1]['code'][0] == d2[0]: 
      data3.append(d1[0] + d2[1:]) 
관련 문제