Python 2.7中按组重新标记列表的列表内元素的实现问题
解决Python 2.7列表分组替换标签的问题
我懂你现在的困扰——按子列表索引2到8的值分组后,想把每组里的旧标签X00000统一换成对应新标签,但之前遍历分组的方式没成功。大概率是分组处理时没做好键映射,或者用itertools.groupby时没先排序导致分组不对,我给你两个可行的方案:
方案1:先建立分组键与新标签的映射(更稳妥)
这种方法不需要依赖分组后的结构,先把所有唯一的分组规则提取出来,和你的NEW_LABELS一一对应,再批量替换:
# 假设你的原列表结构是这样的:每个子列表第一个元素是旧标签,索引2-8是分组依据 # my_list_0 = [['X00000', 'data1', 'g1_val1', 'g1_val2', ...], ...] # 1. 提取所有唯一的分组键(转成元组,因为列表不能当字典的key) unique_group_keys = list(set(tuple(item[2:9]) for item in my_list_0)) # 2. 建立分组键到新标签的映射(确保NEW_LABELS长度和unique_group_keys一致) label_mapping = dict(zip(unique_group_keys, NEW_LABELS)) # 3. 遍历原列表,替换旧标签 for sub_list in my_list_0: # 获取当前子列表的分组键 current_key = tuple(sub_list[2:9]) # 替换第一个元素的旧标签,如果找不到对应键就保留原标签(可选) sub_list[0] = label_mapping.get(current_key, sub_list[0])
方案2:用itertools.groupby遍历分组替换(注意排序)
如果你已经在用groupby分组,一定要记得先按分组键排序,因为groupby只会把连续的相同键归为一组,不连续的同组元素会被分成不同组,这很可能是你之前失败的原因:
from itertools import groupby # 1. 先按分组键(索引2-8)排序原列表 sorted_list = sorted(my_list_0, key=lambda x: x[2:9]) # 2. 遍历分组,同时配对NEW_LABELS里的标签 for (group_key, group_items), new_label in zip(groupby(sorted_list, key=lambda x: x[2:9]), NEW_LABELS): # 替换当前分组里所有子列表的旧标签 for item in group_items: item[0] = new_label
额外小提示
- 因为Python 2.7里
set是无序的,如果用方案1,unique_group_keys的顺序可能和你分组的顺序不一致,要确保NEW_LABELS的顺序和unique_group_keys对应;如果需要保持分组出现的顺序,可以用collections.OrderedDict提取唯一键:from collections import OrderedDict unique_group_keys = list(OrderedDict.fromkeys(tuple(item[2:9]) for item in my_list_0)) - 如果你的原列表里旧标签不是在子列表的第一个位置,记得把
sub_list[0]改成对应的索引位置。
内容的提问来源于stack exchange,提问作者alc
相关产品推荐
相关产品推荐

