如何根据另一列表的连续元素对目标列表进行分组?
列表分组问题的解决方案
这本质是分组问题,实现过程中通常会借助字典做中间映射,最终输出嵌套列表。
方法一:手动遍历+字典映射
字典的键值对结构天然适合存储“分组标识-对应元素列表”的关系,步骤如下:
- 初始化空字典,键对应List1的元素,值对应List2中同组的对象列表
- 用
zip()同时遍历List1和List2的配对元素 - 将每个对象添加到对应键的列表中
- 最后将字典的values转换为列表,得到目标嵌套列表
示例代码:
list1 = [1,1,1,2,3,3,4,5,5] list2 = ['objectA', 'objectB', 'objectC', 'objectD', 'objectE', 'objectF', 'objectG', 'objectH', 'objectI'] group_dict = {} for key, obj in zip(list1, list2): # 若键不存在则初始化空列表 group_dict.setdefault(key, []).append(obj) list3 = list(group_dict.values()) # 结果:[['objectA', 'objectB', 'objectC'], ['objectD'], ['objectE', 'objectF'], ['objectG'], ['objectH', 'objectI']]
方法二:使用itertools.groupby
itertools.groupby是Python标准库中专门用于分组的工具,但注意它仅对连续的相同元素分组,因此需要先按分组键排序:
- 用
zip()配对List1和List2的元素,再按List1的元素排序 - 用
groupby按分组键分组,提取每组中的对象并组成列表
示例代码:
from itertools import groupby list1 = [1,1,1,2,3,3,4,5,5] list2 = ['objectA', 'objectB', 'objectC', 'objectD', 'objectE', 'objectF', 'objectG', 'objectH', 'objectI'] # 先按分组键排序配对元素 sorted_pairs = sorted(zip(list1, list2), key=lambda x: x[0]) # 分组并生成嵌套列表 list3 = [[obj for _, obj in group] for _, group in groupby(sorted_pairs, key=lambda x: x[0])]
总结:虽然最终输出是列表,但字典是实现分组逻辑的核心工具,这类问题属于分组映射场景,两种方法都能高效解决需求。
内容的提问来源于stack exchange,提问作者user134222
相关产品推荐
相关产品推荐

