如何在defaultdict中同时存储组合计数与辅助信息
解决方案:在计数时同时存储辅助信息
你可以通过调整defaultdict的初始化逻辑,让它每个键对应一个包含计数和辅助信息列表的可变结构(比如列表),这样就能轻松同时更新计数和收集辅助信息了。下面是修改后的完整代码:
import pandas as pd from itertools import combinations from collections import defaultdict mydf = pd.DataFrame({ 'auxinfo': ['first', 'second', 'third'], 'list_to_count': [['apple', 'banana'], ['apple', 'banana', 'chicken'], ['apple']] }) # 初始化defaultdict,每个键对应 [计数, 辅助信息列表] d = defaultdict(lambda: [0, []]) for r in mydf.itertuples(): combos = combinations(r.list_to_count, 2) for combo in combos: combo_name = ','.join(sorted(combo)) # 更新计数 d[combo_name][0] += 1 # 添加当前行的auxinfo到列表 d[combo_name][1].append(r.auxinfo) # 如果需要把结果转换成你期望的元组格式(可选) result = {k: tuple(v) for k, v in d.items()} print(result)
代码解释
- 初始化
defaultdict:用lambda: [0, []]作为默认工厂函数,这样每个新组合第一次出现时,会自动创建一个[0, []]的结构——第一个元素是计数,第二个是辅助信息列表。 - 更新数据:遍历每个组合时,直接对计数加1,并把当前行的
auxinfo追加到列表里,操作非常直观。 - 转换为元组格式(可选):如果你需要最终结果是元组(比如不可变的结构),可以用字典推导式把每个值从列表转成元组。
运行结果
执行后会输出你期望的格式:
{'apple,banana': (2, ['first', 'second']), 'apple,chicken': (1, ['second']), 'banana,chicken': (1, ['second'])}
为什么不用defaultdict(tuple)?因为元组是不可变类型,无法直接修改计数或追加元素,用列表作为中间结构会更灵活,最后再转成元组即可。
内容的提问来源于stack exchange,提问作者jeremy_rutman
相关产品推荐
相关产品推荐

