如何在Python中重组列表:将重复首元素对应唯一次元素分组
解决方案:合并重复键的子列表
没问题,这个需求在Python里完全可以实现,我给你两种实用的思路,你可以根据自己的场景选择:
方法一:用普通字典收集(通用场景推荐)
这是最直观的实现方式,不管原始列表里的键是否连续都能正确处理,不需要提前排序。
假设你的原始列表是这样的:
original_list = [ ['string1', '1234567'], ['string1', '1234576'], ['string1', '1234765'], ['string2', '7654321'], ['string2', '7654123'] ]
实现步骤:
- 初始化一个空字典,用来存储每个键对应的所有值
- 遍历原始列表,把每个子列表的第二个元素追加到对应键的列表中
- 把字典转换成你需要的列表格式
代码示例:
# 初始化空字典 result_dict = {} for key, value in original_list: # 如果键不存在,先创建一个空列表 if key not in result_dict: result_dict[key] = [] # 追加对应的值 result_dict[key].append(value) # 转换为目标格式 final_result = [[k, v] for k, v in result_dict.items()]
运行后final_result就是你想要的结果:
[['string1', ['1234567', '1234576', '1234765']], ['string2', ['7654321', '7654123']]]
方法二:用itertools.groupby(适合已排序的列表)
如果你的原始列表已经按第一个元素(键)排好序了,用itertools.groupby会更高效。如果没排序,需要先做排序操作。
实现步骤:
- 导入需要的模块
- (可选)对原始列表按键排序
- 用
groupby分组,并把每组的第二个元素收集成列表
代码示例:
from itertools import groupby from operator import itemgetter original_list = [ ['string1', '1234567'], ['string1', '1234576'], ['string1', '1234765'], ['string2', '7654321'], ['string2', '7654123'] ] # 如果原始列表未按键排序,先执行这一步 sorted_list = sorted(original_list, key=itemgetter(0)) # 分组并转换格式 final_result = [[key, [item[1] for item in group]] for key, group in groupby(sorted_list, key=itemgetter(0))]
注意点:
groupby只会把连续相同的键分到一组,如果原始列表里的键是分散的(比如先出现string1,再string2,又回到string1),不排序的话会把前后两个string1分成两组,这时候就更适合用第一种字典的方法。
关于你的思路疑问
你提到的“先生成次元素的新列表,再提取首元素的唯一值列表,再进行映射”其实就是第一种字典方法的核心思路——先通过字典建立键和对应值列表的映射,再把映射关系转换成目标格式,Python完全支持这种操作,而且实现起来非常简洁。
内容的提问来源于stack exchange,提问作者Claus
相关产品推荐
相关产品推荐

