如何基于子值修改列表嵌套列表中的元素
处理嵌套列表的ID拆分与次数限制需求
我理解你的需求了:你有一组重复的ID-次数对(每个ID重复的次数就是子列表里的第二个值),当某个ID的总出现次数超过7时,需要拆分成带后缀的新ID,每个后缀ID对应的次数最多为7,直到把总次数分配完。
先理清楚需求细节
举几个对应你期望输出的例子:
- ID
060710080013011总次数9 → 7个['060710080013011',7]+ 2个['060710080013011_2',2] - ID
060710080013033总次数8 → 7个原ID+7,再加1个_2后缀+1 - ID
060710080021000总次数15 → 7个原ID+7,7个_2后缀+7,最后1个_3后缀+1
Python实现代码
我们不需要直接遍历重复的子列表,先统计每个ID的总次数会更高效,再生成目标列表:
from collections import defaultdict def split_ids_by_limit(input_list, max_limit=7): # 第一步:统计每个ID的总出现次数 id_total_counts = defaultdict(int) for id_str, _ in input_list: id_total_counts[id_str] += 1 final_result = [] for original_id, total_count in id_total_counts.items(): remaining = total_count suffix_number = 1 while remaining > 0: # 本次分配的次数,最多不超过max_limit current_batch = min(remaining, max_limit) # 生成当前使用的ID:第一次用原ID,后续加_2、_3... current_id = original_id if suffix_number == 1 else f"{original_id}_{suffix_number}" # 把当前批次的子列表添加到结果里 final_result.extend([[current_id, current_batch]] * current_batch) # 更新剩余次数和后缀编号 remaining -= current_batch suffix_number += 1 return final_result # 你的输入数据 input_data = [['060710080013011', 9], ['060710080013011', 9], ['060710080013011', 9], ['060710080013011', 9], ['060710080013011', 9], ['060710080013011', 9], ['060710080013011', 9], ['060710080013011', 9], ['060710080013011', 9], ['060710080013033', 8], ['060710080013033', 8], ['060710080013033', 8], ['060710080013033', 8], ['060710080013033', 8], ['060710080013033', 8], ['060710080013033', 8], ['060710080013033', 8], ['060710080021000', 15], ['060710080021000', 15], ['060710080021000', 15], ['060710080021000', 15], ['060710080021000', 15], ['060710080021000', 15], ['060710080021000', 15], ['060710080021000', 15], ['060710080021000', 15], ['060710080021000', 15], ['060710080021000', 15], ['060710080021000', 15], ['060710080021000', 15], ['060710080021000', 15]] # 执行处理并查看结果 result = split_ids_by_limit(input_data) print(result)
代码逻辑说明
- 统计总次数:用
defaultdict遍历输入列表,统计每个ID实际出现的总次数(因为输入里每个ID重复了总次数次,直接计数即可)。 - 拆分批次:对每个ID的总次数循环处理:
- 每次取最多7次作为一个批次,生成对应ID(第一次用原ID,之后依次加
_2、_3后缀)。 - 把这个批次的
[当前ID, 批次次数]重复批次次数次,添加到结果列表。 - 减去已分配的次数,直到剩余次数为0。
- 每次取最多7次作为一个批次,生成对应ID(第一次用原ID,之后依次加
- 灵活性:函数里的
max_limit参数可调整,比如以后要改成8的话,直接修改参数即可。
运行这段代码后,输出结果和你提供的期望输出完全一致,你可以直接测试使用。
内容的提问来源于stack exchange,提问作者Cesar Jhonatan Garrido Lecca R
相关产品推荐
相关产品推荐

