基于元组列表生成字典:按最后一列键汇总第三列数值
按语言分组求和的Python实现方案
嘿,我给你几个实用的Python解法,轻松搞定这个按元组最后一列(语言)分组、第三列数值求和的需求:
方法1:基础循环实现(新手友好)
这个方法逻辑最直观,适合刚接触Python的朋友理解:
tuple_list = [(2018, '2', '172767270', '202', 'gege', 'French'), (2012, '212', '56007072', '200', 'cdadcadc', 'Minangkabou'), (2013, 'J21', '186144990', '200', 'sacacs', 'Latin'), (2020, '3', '1374767888', '201', 'test', 'French')] result = {} for item in tuple_list: # 提取语言(元组最后一列)和第三列的数值(转成整数才能求和) lang = item[-1] num = int(item[2]) # 判断语言是否已在字典中,存在则累加,不存在则初始化 if lang in result: result[lang] += num else: result[lang] = num print(result) # 输出结果: {'French': 1547535158, 'Minangkabou': 56007072, 'Latin': 186144990}
方法2:用collections.defaultdict简化代码
如果不想写繁琐的判断语句,用collections.defaultdict可以让代码更简洁:
from collections import defaultdict tuple_list = [(2018, '2', '172767270', '202', 'gege', 'French'), (2012, '212', '56007072', '200', 'cdadcadc', 'Minangkabou'), (2013, 'J21', '186144990', '200', 'sacacs', 'Latin'), (2020, '3', '1374767888', '201', 'test', 'French')] # 初始化默认值为0的字典 result = defaultdict(int) for item in tuple_list: result[item[-1]] += int(item[2]) # 可选:转成普通字典(如果不需要defaultdict的特性) result = dict(result) print(result)
defaultdict(int)会自动给新出现的键赋值0,所以我们可以直接累加,省去了判断键是否存在的步骤。
方法3:用itertools.groupby(适合有序数据)
如果你的数据可以先按语言排序,itertools.groupby是个不错的选择:
from itertools import groupby tuple_list = [(2018, '2', '172767270', '202', 'gege', 'French'), (2012, '212', '56007072', '200', 'cdadcadc', 'Minangkabou'), (2013, 'J21', '186144990', '200', 'sacacs', 'Latin'), (2020, '3', '1374767888', '201', 'test', 'French')] # 先按语言排序,因为groupby要求相同键的元素必须连续 sorted_list = sorted(tuple_list, key=lambda x: x[-1]) result = {} # 按语言分组,然后对每组的第三列数值求和 for lang, group in groupby(sorted_list, key=lambda x: x[-1]): result[lang] = sum(int(item[2]) for item in group) print(result)
注意:使用groupby之前必须先排序,否则相同语言的元组如果不连续,会被分成不同的组,导致结果错误。
方法4:用pandas快速处理(适合大数据量)
如果你的数据量很大,用pandas会更高效,代码也更简洁:
import pandas as pd tuple_list = [(2018, '2', '172767270', '202', 'gege', 'French'), (2012, '212', '56007072', '200', 'cdadcadc', 'Minangkabou'), (2013, 'J21', '186144990', '200', 'sacacs', 'Latin'), (2020, '3', '1374767888', '201', 'test', 'French')] # 把元组列表转成DataFrame df = pd.DataFrame(tuple_list, columns=['year', 'col2', 'num', 'col4', 'name', 'lang']) # 把第三列的字符串转成整数类型 df['num'] = df['num'].astype(int) # 按语言分组求和,再转成字典 result = df.groupby('lang')['num'].sum().to_dict() print(result)
pandas的分组功能专门针对大数据量优化,处理几万甚至几十万条数据时,效率会比纯Python循环高很多。
内容的提问来源于stack exchange,提问作者john
相关产品推荐
相关产品推荐

