Python中按指定字段匹配两个列表并合并追加数据的方法
解决方案
方案1:纯Python基础实现(无需第三方库,适合理解底层逻辑)
利用字典做匹配映射,查找效率为O(1),哪怕a有2万条数据运行速度也足够,逻辑完全基于Python内置的列表、字典结构:
# 示例数据 a = [[1,'a','b','a@b',11], [2,'c','d','c@b',22], [3,'e','f','e@b',33]] b = [['a','banana','A',100], ['e','apple','A',100]] # 第一步:构造a的匹配映射字典,键为匹配用的索引1字段,值为需要提取的索引3、4字段 a_match_map = {item[1]: (item[3], item[4]) for item in a} # 第二步:遍历b匹配对应字段,生成目标列表c c = [] for row in b: match_key = row[0] if match_key in a_match_map: # 拼接b当前行和a中对应的两个字段 new_row = row + list(a_match_map[match_key]) c.append(new_row)
如果不需要保留原b列表,也可以直接修改原b:
for row in b: if row[0] in a_match_map: row.extend(a_match_map[row[0]]) c = b
方案2:pandas实现(更简便,适配CSV读写场景)
原始数据本身就是CSV格式的话,用pandas的关联操作无需自己写循环,代码更简洁:
import pandas as pd # 如果是直接读取CSV文件,直接用pd.read_csv("你的文件路径.csv")即可,无需从列表转DataFrame df_a = pd.DataFrame(a) df_b = pd.DataFrame(b) # 按匹配字段关联,只取a中需要的第3、4列(索引从0开始) df_c = pd.merge(df_b, df_a[[1,3,4]], left_on=0, right_on=1, how="inner") # 删掉多余的重复匹配列 df_c = df_c.drop(columns=[1]) # 转成列表格式 c = df_c.values.tolist()
内容的提问来源于stack exchange,提问作者Casper Helmark
相关产品推荐
相关产品推荐

