2013-07-26 90 views
0

我需要將元組列表中的項目與嵌套列表中的項目進行比較,並使用元組和嵌套列表中的項目返回列表。Python:比較和查找元組列表和嵌套列表中的匹配

輸入數據:

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

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

我在轉換輸入數據1,以匹配數據2的嵌套列表格式,如果讓事情變得更容易沒有問題。

我需要的是這樣的:

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

基本上比較data1[x][1]['code'][0] to data2[x][0]

我到目前爲止什麼,但我不知道這是否是正確的:

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名單長於data1和你迭代數據1與data2的長度,索引比它有更多。 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列表的長度並不相同,因此您不能只使用一個在另一個上工作的索引。

你的方法需要嵌套循環(非常低效的,你現在循環整體的data2了在data1每個條目):

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