[英]Python: compare and find matches in a list of tuples and a nested list
我需要将元组列表中的项目与嵌套列表中的项目进行比较,并返回包含元组和嵌套列表中项目的列表。
输入数据:
data1 = [('Name1', {'code':['12345']}),
('Name2', {'code':['78901']})]
data2 = [['12345', '123456', 'name1'],
['78901', '789012', 'name2'],
['34567', '345678', 'name3']]
如果使事情变得更容易,我在转换输入data1以匹配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:list索引超出范围
提前致谢。
首先创建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()
函数添加索引。 您的data1
和data2
列表长度不相等,因此您不能只使用在一个中工作的索引。
您的方法需要嵌套循环(非常低效,您现在循环遍历data1
每个条目的整个data2
):
data3 = []
for d1 in data1:
for d2 in data2:
if d1[1]['code'][0] == d2[0]:
data3.append(d1[0] + d2[1:])
您的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]])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.