
本文介绍如何对包含字符串和整数的嵌套列表(如 [['a', 10], ['a', 20], ['b', 15]])按首元素(字符串)分组,并为每组提取最小整数值,最终返回标准化的最小值列表。
本文介绍如何对包含字符串和整数的嵌套列表(如 [['a', 10], ['a', 20], ['b', 15]])按首元素(字符串)分组,并为每组提取最小整数值,最终返回标准化的最小值列表。
在实际数据处理中,我们常遇到混合类型嵌套结构,例如由类别标签(字符串)和对应数值(整数)组成的二维列表。目标是:对相同字符串键的所有子列表,找出其关联整数的最小值,并汇总为唯一键-最小值对的新嵌套列表。
以示例数据为例:
li = [
['a', 10], ['a', 20], ['a', 20], ['a', 40], ['a', 50], ['a', 60],
['b', 10], ['b', 20], ['b', 30], ['b', 40],
['c', 10], ['c', 10], ['c', 20]
]期望输出为:
[['a', 10], ['b', 10], ['c', 10]]
推荐实现方式:使用字典聚合 + 分组求最小值
最清晰、可读性强且易于扩展的方法是先用字典按字符串键归集所有数值,再遍历字典计算每组最小值:
# 步骤1:按字符串键归集所有整数值
li_dict = {}
for key, value in li:
if key not in li_dict:
li_dict[key] = []
li_dict[key].append(value)
# 步骤2:构建结果列表——每个键对应其最小值
min_li = [[key, min(values)] for key, values in li_dict.items()]
print(min_li)
# 输出: [['a', 10], ['b', 10], ['c', 10]]✅ 优势说明:
- 时间复杂度为 O(n),仅需两次遍历(一次归集、一次求 min);
- 逻辑直观,便于调试与后续扩展(如同时求 max/mean/count);
- 兼容重复键、空值场景(只要确保
value为可比较数字类型)。
更简洁写法(使用 defaultdict 或 itertools.groupby)
若追求代码精简,可借助标准库优化:
from collections import defaultdict
li_dict = defaultdict(list)
for key, val in li:
li_dict[key].append(val)
min_li = [[k, min(v)] for k, v in li_dict.items()]⚠️ 注意事项:
- 输入必须保证每个子列表长度 ≥ 2,且第二个元素为可比较数值(如
int/float),否则min()会抛出TypeError; - 若需保持原始顺序(如首次出现键的顺序),建议使用
dict(Python 3.7+ 保持插入序)或collections.OrderedDict; - 不推荐直接对整个嵌套列表用
min(li, key=lambda x: x[1]),因为它无法实现“按字符串分组后分别取最小”,仅返回全局最小项。
总结
该问题本质是「分组聚合」操作,在 Python 中无需依赖 pandas 即可高效完成。核心思路是:以字符串为键建立映射 → 收集对应数值 → 对每组应用 min() → 重构为嵌套列表。此模式同样适用于求最大值、平均值或统计频次等常见需求,具备良好的通用性与可维护性。

















