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

如何在Python中按条件拆分二维列表(2d-list)?需兼顾内存效率

高效拆分大体积二维列表为按Table分组的子表格

核心思路:避免数据复制,复用原行引用

由于数据量超过5000万行,内存效率的关键是不复制任何原始行数据,仅通过引用将同一Table的行归类到对应子表格中。原始数据仅在内存中存储一份,子表格仅保存行的引用指针,内存开销极低。


情况1:原始二维列表已按Table字段排序

如果数据是按Table值连续排列的(如示例中从"1"到"139"依次出现),用一次遍历完成分组,无需额外哈希表,是内存效率最高的方案:

def split_sorted_table_data(original_2d):
    tables = []
    if len(original_2d) <= 1:  # 排除表头或空数据
        return tables
    
    # 跳过表头,从数据行开始处理
    data_rows = original_2d[1:]
    current_table_id = data_rows[0][0]
    current_group = [data_rows[0]]
    
    for row in data_rows[1:]:
        if row[0] == current_table_id:
            current_group.append(row)
        else:
            tables.append(current_group)
            current_table_id = row[0]
            current_group = [row]
    # 添加最后一组数据
    tables.append(current_group)
    return tables

使用方式:

tables = split_sorted_table_data(your_2d_list)
# 访问第一个表格的第一行第二列值
print(tables[0][0][1])  # 输出 "0.1"
# 访问第二个表格的第一行第三列值
print(tables[1][0][2])  # 输出 "e_1"

情况2:原始二维列表未按Table字段排序

如果数据是无序的,用字典做分组容器,同样仅存储行引用,内存开销可控:

def split_unsorted_table_data(original_2d):
    table_groups = {}
    if len(original_2d) <= 1:
        return []
    
    data_rows = original_2d[1:]
    for row in data_rows:
        table_id = row[0]
        if table_id not in table_groups:
            table_groups[table_id] = []
        table_groups[table_id].append(row)
    
    # 可选:按Table ID排序输出,不需要则直接用 list(table_groups.values())
    sorted_table_ids = sorted(table_groups.keys())
    tables = [table_groups[tid] for tid in sorted_table_ids]
    return tables

关键注意事项

  1. 跳过表头:代码中默认原始二维列表第一行是表头,若数据无表头,可移除data_rows = original_2d[1:]这一行,直接遍历original_2d。
  2. 内存特性:所有子表格中的行都是原始列表的引用,修改子表格的行数据会同步修改原始列表;若需要独立副本,才考虑复制(但会大幅增加内存占用,不推荐)。
  3. 性能表现:排序后的遍历方案时间复杂度为O(n),无序分组为O(n)(字典查找是O(1)平均情况),均能高效处理5000万行数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 18:01:25