Python:在元组列表和嵌套列表中比较和查找匹配项

时间:2013-07-26 11:04:08

标签: python list compare

我需要将元组列表中的项目与嵌套列表中的项目进行比较,并返回包含元组和嵌套列表中项目的列表。

输入数据:

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

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

在将输入数据1转换为与data2的嵌套列表格式匹配时,我没有任何问题,如果这样可以使事情变得更容易。

我需要的是:

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:列表索引超出范围

提前致谢。

2 个答案:

答案 0 :(得分: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:])

答案 1 :(得分:0)

您的data2列表比data1长,并且您使用data2的长度迭代data1,索引多于它。 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]])