如何将包含分类与对应id的嵌套列表按分类聚合id生成新列表
聚合分类ID的实现方案
列表推导式本身适合做无状态的逐元素转换或过滤,这种需要累计同分类多个ID的场景,更推荐先用字典做中间存储实现,逻辑更清晰、效率也更高:
# 输入数据 books = [ ['Health', 18327], ['Health', 19438], ['Health', 12549], ['Health', 11662], ['E.R.nurses', 21458], ] # 聚合逻辑 category_map = {} for cate, id_val in books: # 分类首次出现时初始化列表,第一个元素为分类名 if cate not in category_map: category_map[cate] = [cate] # 追加当前ID到对应分类的列表 category_map[cate].append(id_val) # 转换为目标输出格式 output = list(category_map.values())
运行后output的结果就是你需要的格式:
[['Health', 18327, 19438, 12549, 11662], ['E.R.nurses', 21458]]
如果你确实需要用列表推导式实现,可以借助itertools.groupby,但要注意groupby要求同分类元素必须相邻,所以需要先对原列表按分类排序:
from itertools import groupby output = [ [cate] + [item[1] for item in group] for cate, group in groupby(sorted(books, key=lambda x: x[0]), key=lambda x: x[0]) ]
两种方案的差异:
- 字典法时间复杂度为O(n),数据量大时效率更高
- groupby法多了排序步骤,时间复杂度为O(nlogn),优点是可以写为列表推导式形式
内容的提问来源于stack exchange,提问作者John W
相关产品推荐
相关产品推荐

