如何基于公共字符串对嵌套列表分组并保留完整子列表?
按子列表指定元素分组并保留完整子列表的解决方案
我来帮你解决这个分组问题,你之前的代码之所以只得到分组的键值,是因为在列表推导式里只提取了子列表的第4个元素(y[3]),而没有保留整个子列表。下面给你两种实用的解决方案,分别是纯Python实现和pandas实现,都能满足你保留完整子列表+动态分组的需求:
一、纯Python方案(无需第三方库)
推荐使用collections.defaultdict来实现,它能自动帮我们处理分组的初始化,代码简洁高效:
from collections import defaultdict old_data = [[0,0,0,'X'],[1,0,0,'A'],[2,0,0,'HJ'],[3,0,0,'X'],[4,0,0,'A'],[5,0,0,'K'],[6,0,0,'K']] # 初始化一个默认值为列表的字典,用于存储分组结果 grouped_data = defaultdict(list) # 遍历原始数据,按子列表索引3的元素分组 for sub_list in old_data: group_key = sub_list[3] grouped_data[group_key].append(sub_list) # 如果需要单独的变量(按需取用) X_list = grouped_data['X'] A_list = grouped_data['A'] HJ_list = grouped_data['HJ'] K_list = grouped_data['K'] # 打印验证结果 print("X_list:", X_list) print("A_list:", A_list) print("HJ_list:", HJ_list) print("K_list:", K_list)
对你原有代码的修改
如果你想基于你原来的列表推导式修改,只需要把提取y[3]改成直接取y即可:
old_data = [[0,0,0,'X'],[1,0,0,'A'],[2,0,0,'HJ'],[3,0,0,'X'],[4,0,0,'A'],[5,0,0,'K'],[6,0,0,'K']] # 获取所有不重复的分组键 values = sorted(set(map(lambda x: x[3], old_data))) # 修改列表推导式,保留完整子列表 newlist = [[y for y in old_data if y[3] == x] for x in values] # 此时newlist就是按顺序排列的分组列表:[[X组], [A组], [HJ组], [K组]]
不过这种方法需要多次遍历原始数据,数据量大时效率不如defaultdict的方案。
二、pandas方案(适合大规模数据集)
如果你习惯用pandas处理数据,也可以快速实现分组:
import pandas as pd old_data = [[0,0,0,'X'],[1,0,0,'A'],[2,0,0,'HJ'],[3,0,0,'X'],[4,0,0,'A'],[5,0,0,'K'],[6,0,0,'K']] # 把原始数据转成DataFrame df = pd.DataFrame(old_data) # 按第4列(索引3)分组,将每组转成嵌套列表并存储为字典 grouped_dict = df.groupby(3).apply(lambda x: x.values.tolist()).to_dict() # 同样可以按需提取单独的分组列表 X_list = grouped_dict['X'] A_list = grouped_dict['A'] HJ_list = grouped_dict['HJ'] K_list = grouped_dict['K']
小提示
不建议动态生成大量单独的变量(比如如果有100种分组,就要创建100个变量),直接使用字典grouped_data或grouped_dict来访问分组会更灵活,比如通过grouped_data['X']就能随时获取X对应的子列表。
内容的提问来源于stack exchange,提问作者doctor_senpai69
相关产品推荐
相关产品推荐

