如何在Mapper输出结果上使用groupby进行分组处理?
解决方案
你需要修改代码以实现按字母分组并收集对应的整数元组列表,以下是调整后的代码:
from itertools import groupby from operator import itemgetter import sys def read_mapper_output(file): for line in file: # 拆分每行,得到 [字母, 数字1, 数字2, 数字3] 的列表 yield line.strip().split() # 读取mapper输出 data = read_mapper_output(sys.stdin) # 按字母排序,确保相同字母的行连续,groupby才能正确分组 data_sorted = sorted(data, key=itemgetter(0)) # 按字母分组处理 for key, keygroup in groupby(data_sorted, itemgetter(0)): # 将每组的数字部分转为整数元组,收集成列表 tuple_list = [tuple(map(int, item[1:])) for item in keygroup] # 按要求格式输出 print(f"{key} {tuple_list}")
关键修改说明:
- 排序处理:添加
data_sorted = sorted(data, key=itemgetter(0)),因为itertools.groupby只会将连续相同的key归为一组,排序后能确保所有同字母的行被集中处理。 - 元组生成:替换原字符串拼接逻辑,通过
tuple(map(int, item[1:]))将每行的三个数字字符串转为整数元组,再收集成列表。 - 格式化输出:使用f-string简化输出格式,直接打印字母和对应的元组列表。
内容的提问来源于stack exchange,提问作者Zaku
相关产品推荐
相关产品推荐

