如何对嵌套列表中的同类型元素进行分组?
如何对嵌套列表中的同类型元素进行分组?
看起来你想要把第一个元素相同的子列表归为一组对吧?你的思路方向是对的,但问题出在每次循环都重新创建了空列表l,导致每个元素都只能单独进一个新列表,没法累积同类型的元素。下面给你几种可行的解决方法:
方法一:用字典做中间存储(最直观)
字典的键可以用来存分组标识(也就是子列表的第一个元素A/B/C),值用来存对应分组的所有子列表,最后把字典的值转成列表就是你要的格式:
pairs = [['A', 'berries'], ['A', 'bananas'], ['B', 'apples'], ['C', 'oranges'], ['C', 'apricots'], ['C', 'tomatoes']] # 初始化空字典存储分组 grouped_dict = {} for item in pairs: group_key = item[0] # 如果当前分组标识不在字典里,先创建空列表 if group_key not in grouped_dict: grouped_dict[group_key] = [] # 将当前子列表添加到对应分组中 grouped_dict[group_key].append(item) # 把字典的所有值转换成目标嵌套列表格式 final_result = list(grouped_dict.values()) print(final_result)
运行这段代码后,输出就是你想要的:
[[['A', 'berries'], ['A', 'bananas']], [['B', 'apples']], [['C', 'oranges'], ['C', 'apricots'], ['C', 'tomatoes']]]
方法二:用itertools.groupby(简洁高效)
Python标准库的itertools.groupby专门用来做分组,但要注意必须先按分组键排序——因为它只会把连续的相同键元素归为一组:
from itertools import groupby pairs = [['A', 'berries'], ['A', 'bananas'], ['B', 'apples'], ['C', 'oranges'], ['C', 'apricots'], ['C', 'tomatoes']] # 先按子列表第一个元素排序,确保同类型元素连续 sorted_pairs = sorted(pairs, key=lambda x: x[0]) # 按第一个元素分组 groups = groupby(sorted_pairs, key=lambda x: x[0]) # 把每个分组转换成列表,收集到结果中 final_result = [list(group) for _, group in groups] print(final_result)
方法三:手动跟踪当前分组(适合理解逻辑)
如果不想用字典或标准库,也可以手动跟踪当前分组的标识和内容,逐步构建结果:
pairs = [['A', 'berries'], ['A', 'bananas'], ['B', 'apples'], ['C', 'oranges'], ['C', 'apricots'], ['C', 'tomatoes']] final_result = [] # 处理空列表的情况 if not pairs: print(final_result) # 初始化第一个分组 current_key = pairs[0][0] current_group = [pairs[0]] # 从第二个元素开始遍历 for item in pairs[1:]: if item[0] == current_key: # 同类型,加入当前分组 current_group.append(item) else: # 不同类型,把当前分组加入结果,然后开始新分组 final_result.append(current_group) current_key = item[0] current_group = [item] # 别忘了把最后一个分组加入结果 final_result.append(current_group) print(final_result)
备注:内容来源于stack exchange,提问作者J Do
相关产品推荐
相关产品推荐

