Python如何将整数列表或频次字典转换为分组聚合的嵌套列表
解决方法
方法1:基于已有频次字典d实现(最便捷)
你已经统计好了每个数字的出现频次,直接对字典的键升序排序后通过列表推导式生成即可,一行代码就能完成:
final = [[k] * v for k, v in sorted(d.items())]
逻辑说明:sorted(d.items())会把字典的键值对按数字从小到大排序,遍历每个键值对时,用[k] * v生成对应长度的子列表,刚好匹配你需要的结构。
方法2:从原始列表original直接生成
如果不需要复用你之前生成的d和first_try,可以用Python标准库的collections.Counter直接统计频次后生成:
from collections import Counter # 统计元素出现频次 count_dict = Counter(original) # 生成目标嵌套列表 final = [[k] * v for k, v in sorted(count_dict.items())]
方法3:基于已有first_try合并实现
如果你要基于已经生成的first_try做合并,直接遍历合并相同元素的子列表即可:
final = [] current_group = [] prev_num = None for sub_list in first_try: num = sub_list[0] if num == prev_num or prev_num is None: current_group.append(num) else: final.append(current_group) current_group = [num] prev_num = num # 追加最后一组数据 if current_group: final.append(current_group)
补充说明
如果你的需求不需要按数字升序排列,而是要保持数字在原始列表中首次出现的顺序,只需要把上述代码中的sorted(d.items())替换为dict.fromkeys(original).keys()即可,示例如下:
final = [[k] * d[k] for k in dict.fromkeys(original)] # 输出顺序和原始列表首次出现顺序一致:[[1], [6,6,6], [3,3], [9,9], [4], [5], [2], [7], [8]]
内容的提问来源于stack exchange,提问作者Mercredi
相关产品推荐
相关产品推荐

