Python中统计各季度数据数量及拆分对应子列表方法
嘿,作为Python新手能想到用Counter统计季度数量,已经迈出很棒的一步啦!接下来咱们就一步步搞定「按指定季度集合拆分数据为对应子列表」的需求~
首先先明确一下假设的原始数据结构(如果你的数据结构不一样,后面有适配技巧):我假设你有一个列表,每个元素是数据项+季度标识的元组,比如:
data = [("item_A", "1Q2015"), ("item_B", "2Q2015"), ("item_C", "1Q2015"), ("item_D", "3Q2016"), ("item_E", "2Q2017"), ("item_F", "1Q2017")]
同时你已经定义好要拆分的目标季度集合:
target_quarters = ["1Q2015", "2Q2015", "3Q2015", "4Q2015", "1Q2016", "2Q2016", "3Q2016", "4Q2016", "1Q2017", "2Q2017"]
方法一:用defaultdict高效分组(推荐)
这种方法只需要遍历一次原始数据就能完成分组,效率很高,而且逻辑清晰:
from collections import defaultdict # 初始化一个字典,每个键对应一个空列表 quarter_groups = defaultdict(list) # 遍历每一组数据项+季度 for item, qtr in data: # 只处理目标季度集合里的季度 if qtr in target_quarters: quarter_groups[qtr].append(item) # 如果需要按目标季度的顺序输出结果(避免字典顺序不确定的问题) for qtr in target_quarters: print(f"{qtr}对应的子列表:{quarter_groups.get(qtr, [])}")
解释一下:defaultdict会自动为不存在的键创建空列表,不用手动判断“这个季度有没有在字典里”,直接append就行;最后按target_quarters的顺序遍历,能保证输出顺序和你指定的季度集合一致。
方法二:用推导式快速生成
如果你的数据量不大,或者想要更简洁的代码,可以用列表推导式或字典推导式:
# 单个季度的子列表生成 q1_2015_items = [item for item, qtr in data if qtr == "1Q2015"] # 批量生成所有目标季度的子列表字典 quarter_groups = {qtr: [item for item, qtr_data in data if qtr_data == qtr] for qtr in target_quarters}
这种写法很紧凑,但要注意:字典推导式会遍历len(target_quarters)次原始数据,如果数据量很大,效率会比方法一低一些。
适配不同数据结构的小技巧
如果你的原始数据是分开的两个列表(比如一个items列表存数据项,一个quarter列表存对应季度),可以用zip()把它们配对后再处理:
items = ["item_A", "item_B", "item_C", "item_D", "item_E", "item_F"] quarters = ["1Q2015", "2Q2015", "1Q2015", "3Q2016", "2Q2017", "1Q2017"] quarter_groups = defaultdict(list) for item, qtr in zip(items, quarters): if qtr in target_quarters: quarter_groups[qtr].append(item)
这样就能轻松把数据按你指定的季度拆分成对应的子列表啦~
内容的提问来源于stack exchange,提问作者KOLA JAGADISH
相关产品推荐
相关产品推荐

