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

如何在Python中重组列表:将重复首元素对应唯一次元素分组

解决方案:合并重复键的子列表

没问题,这个需求在Python里完全可以实现,我给你两种实用的思路,你可以根据自己的场景选择:

方法一:用普通字典收集(通用场景推荐)

这是最直观的实现方式,不管原始列表里的键是否连续都能正确处理,不需要提前排序。

假设你的原始列表是这样的:

original_list = [
    ['string1', '1234567'],
    ['string1', '1234576'],
    ['string1', '1234765'],
    ['string2', '7654321'],
    ['string2', '7654123']
]

实现步骤:

  1. 初始化一个空字典,用来存储每个键对应的所有值
  2. 遍历原始列表,把每个子列表的第二个元素追加到对应键的列表中
  3. 把字典转换成你需要的列表格式

代码示例:

# 初始化空字典
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会更高效。如果没排序,需要先做排序操作。

实现步骤:

  1. 导入需要的模块
  2. (可选)对原始列表按键排序
  3. 用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:08:32