You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复Python函数以原样输出CSV中匹配ID的行

问题:匹配指定Arbitration_ID后返回与文件行序完全一致的结果

需求:实现一个函数,查找文件中位置不固定的Arbitration_ID列,匹配指定ID值后返回对应的行数据,禁止使用任何导入语句。现有代码在处理列顺序不同的文件时,返回的行元素顺序与文件原始行不一致。

现有代码

def ecu_data(arbitration_id, data):
    """ Returns a list of the timestamp and data of an arbitration_ID. """
    rows = []
    arb_index = data[0].index("Arbitration_ID")
    for row in data[0:]:
        if row[arb_index] == arbitration_id:
            rows.append(row)
    return rows

测试用例与问题

前两个测试用例(基于列顺序固定的file1.csv)输出符合预期,但第三个测试用例(基于列顺序不同的file3.csv)出现偏差:

  • 预期输出(文件原始行顺序):
    ['1597759356.234800', '8', '368', '00 00 00 00 00 FA 0A 40', 'Normal', 'Normal']
    
  • 实际输出:
    ['1597759356.234800', '368', '8', '00 00 00 00 00 FA 0A 40', 'Normal', 'Normal']
    

解决方案

问题根源是代码可能存在隐式的行元素重排操作(比如之前为了满足注释要求手动按固定顺序组装新列表)。要返回与文件完全一致的行,只需确保直接保留原始行的结构,不对元素顺序做任何调整:

修改后的代码

def ecu_data(arbitration_id, data):
    """ 返回与文件原始行序一致的指定Arbitration_ID对应的行数据 """
    rows = []
    # 获取表头中Arbitration_ID的索引
    arb_index = data[0].index("Arbitration_ID")
    # 从第二行开始遍历数据行(跳过表头)
    for row in data[1:]:
        if row[arb_index] == arbitration_id:
            # 直接追加原始行,不修改元素顺序;copy避免外部修改影响返回结果
            rows.append(row.copy() if isinstance(row, list) else row)
    return rows

关键修改点

  1. 遍历范围调整:将data[0:]改为data[1:],跳过表头行,符合数据处理逻辑。
  2. 保留原始行结构:直接追加原始行对象,确保返回的行完全复刻文件中的元素顺序;调用copy()是为了避免后续外部对原数据的修改影响返回结果。

这样修改后,无论文件中Arbitration_ID列的位置如何变化,返回的行都将与文件中的原始行顺序完全一致。

内容的提问来源于stack exchange,提问作者confusedcoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 10:07:56