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

列表多列唯一值的序号标注:使用collections模块是否可行?

嘿,你的思路完全正确!collections模块确实是解决这个需求的绝佳选择,尤其是其中的OrderedDict(或者Python 3.7及以上版本里的普通字典,因为它已经默认保留插入顺序了),能帮你精准追踪第1-3列的唯一组合,同时按顺序生成第4列的序号。

具体实现步骤
  • 先把每一行的第1-3列组合成元组(元组是不可变类型,可以作为字典的键,而列表不行),以此作为唯一标识。
  • 用字典类来记录这些唯一组合:每遇到一个新的组合,就分配一个递增的序号;如果是已经出现过的组合,直接复用之前的序号。
  • 最后将生成的序号对应填充到每一行的第4列即可。
代码示例

使用OrderedDict(兼容所有Python版本)

from collections import OrderedDict

# 假设你的原始数据是这样的二维列表
raw_data = [
    ["A", "X", "1", ""],
    ["B", "Y", "2", ""],
    ["A", "X", "1", ""],
    ["C", "Z", "3", ""],
    ["B", "Y", "2", ""],
]

# 初始化有序字典,用来存唯一组合和对应的序号
unique_groups = OrderedDict()
current_seq = 1

for row in raw_data:
    # 提取第1-3列组成唯一键
    group_key = (row[0], row[1], row[2])
    if group_key not in unique_groups:
        unique_groups[group_key] = current_seq
        current_seq += 1
    # 给第4列赋值序号
    row[3] = unique_groups[group_key]

# 查看处理后的结果
for item in raw_data:
    print(item)

Python 3.7+ 简化版本(用普通字典)

从Python 3.7开始,普通字典会默认保留键的插入顺序,所以可以不用OrderedDict,代码更简洁:

# Python3.7及以上版本适用
raw_data = [
    ["A", "X", "1", ""],
    ["B", "Y", "2", ""],
    ["A", "X", "1", ""],
    ["C", "Z", "3", ""],
    ["B", "Y", "2", ""],
]

unique_groups = {}
current_seq = 1

for row in raw_data:
    group_key = (row[0], row[1], row[2])
    if group_key not in unique_groups:
        unique_groups[group_key] = current_seq
        current_seq += 1
    row[3] = unique_groups[group_key]

# 输出结果
for item in raw_data:
    print(item)

这个方案既高效又能严格保证第4列的序号是按照第1-3列唯一组合的出现顺序排序的,完全匹配你的需求哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:17:27