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

Python中如何按元素值将单层列表分组为嵌套子列表

Python 列表按元素值分组的简洁实现

现有存储水果数据的Python列表:

alist = ["orange","mango","orange","orange","banana","mango"]

需要将同类型水果归类到独立子列表,最终得到目标嵌套列表:

blist = [["orange","orange","orange"],["mango","mango"],["banana"]]

原实现通过硬编码创建固定空列表、多分支判断追加元素的写法扩展性差,新增分类就要手动修改代码,下面是几种更简洁通用的实现方案:


方案1:collections.defaultdict 分组(推荐,通用性最强)

无需提前枚举所有分类值,自动识别列表中出现的所有元素完成分组,Python 3.7+ 版本下字典默认保留元素首次出现的顺序,输出结果和目标结构完全匹配:

from collections import defaultdict

alist = ["orange","mango","orange","orange","banana","mango"]
group_dict = defaultdict(list)
for fruit in alist:
    group_dict[fruit].append(fruit)
blist = list(group_dict.values())

运行后blist的输出和预期完全一致,后续列表新增任意水果类型都不需要修改分组逻辑。

方案2:collections.Counter 快速构造(写法最简洁)

如果列表元素都是可哈希类型(字符串、数字、元组等),可以用Counter统计各元素出现次数,直接批量生成子列表,Python 3.7+ 同样保留首次出现顺序:

from collections import Counter

alist = ["orange","mango","orange","orange","banana","mango"]
count_res = Counter(alist)
blist = [[fruit] * cnt for fruit, cnt in count_res.items()]

方案3:itertools.groupby 分组

如果同类型元素在原列表中是连续排列的,或者你不要求分组顺序和原列表首次出现顺序一致,可以用groupby实现:

from itertools import groupby

alist = ["orange","mango","orange","orange","banana","mango"]
# 同类型元素不连续时必须先排序,否则分组结果会出错
blist = [list(group) for key, group in groupby(sorted(alist))]

注意:该写法经过排序后,子列表顺序会按元素值排序规则排列,此例中输出顺序为banana、mango、orange,和原需求的顺序不一致,对顺序有要求时不推荐使用。


原硬编码写法仅适用于分类完全固定、后续不会新增类型的极简单场景,上述三种方案都不需要提前定义分类变量、不需要写多分支判断,代码可维护性更强。

内容的提问来源于stack exchange,提问作者bello duafe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 06:36:27