列表多列唯一值的序号标注:使用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
相关产品推荐
相关产品推荐

