Python使用groupby转字典时列表元素丢失问题咨询
问题根因
Python 标准库 itertools.groupby 的核心机制是仅对连续相邻、且分组键相同的元素做聚合,不会自动跨位置收集全列表中所有同键的元素。
对照你的输入列表顺序看:
- 列表第一个元素的分组键是
Johan Liebert,groupby启动第一个分组 - 遍历到第二、第三个元素时,分组键变为
Daisuke Aramaki,groupby直接终止前一个Johan的分组,启动新的Daisuke分组 - 遍历到第四个元素时,分组键又变回
Johan Liebert,groupby不会合并到之前的Johan分组,而是新建一个同键的新分组
你在循环转字典的过程中,后出现的Johan分组会直接覆盖字典中已存在的Johan Liebert键对应的值,最终字典里该键只保留了最后一个Johan分组的内容,第一条Johan开头的子列表就随第一个被终止的分组丢失了。
修复方案
你可以根据需求二选一:
- 方案1:保留groupby用法,分组前先按分组键对原列表排序,确保所有同键元素连续相邻
from itertools import groupby def runoff_rec(xxx): print(xxx) # 按子列表首元素排序,让同键元素连续排列 sorted_xxx = sorted(xxx, key=lambda x: x[0]) sortedvotes = groupby(sorted_xxx, key=lambda x: x[0]) votesdict = {} for key, value in sortedvotes: votesdict[key] = list(value) print(votesdict)
- 方案2:放弃groupby,直接遍历列表手动聚合,不需要提前排序,逻辑更直白,适合不需要特殊排序的场景
def runoff_rec(xxx): print(xxx) votesdict = {} for ballot in xxx: first_choice = ballot[0] if first_choice not in votesdict: votesdict[first_choice] = [] votesdict[first_choice].append(ballot) print(votesdict)
内容的提问来源于stack exchange,提问作者Janek Pawlak
相关产品推荐
相关产品推荐

