Python:在元组列表和嵌套列表中比较并查找匹配项
Posted
技术标签:
【中文标题】Python:在元组列表和嵌套列表中比较并查找匹配项【英文标题】:Python: compare and find matches in a list of tuples and a nested list 【发布时间】:2013-07-26 15:02:34 【问题描述】:我需要将元组列表中的项目与嵌套列表中的项目进行比较,并返回一个包含元组和嵌套列表中的项目的列表。
输入数据:
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 index out of range
提前致谢。
【问题讨论】:
【参考方案1】:先创建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:])
【讨论】:
【参考方案2】:您的 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]])
【讨论】:
简化版更容易理解并且运行良好。以上是关于Python:在元组列表和嵌套列表中比较并查找匹配项的主要内容,如果未能解决你的问题,请参考以下文章