Python:统计字典内列表物品次数及可视化数据结构问题
问题描述
我有一个名为daily_purchases的字典,用于存储周一至周五每个人的购买记录,其中每个用户对应一个购买物品的列表,具体结构如下:
{'Monday': {'Edith': ['Apple', 'Banana', 'Hamburger Buns', 'Carrot', 'Hamburger Buns', 'Apple'], 'Carol': ['Carrot', 'Banana', 'Banana', 'Dragon Fruit', 'Apple', 'Apple', 'Carrot', 'Carrot', 'Eggs', 'Banana'], 'Hannah': ['Hamburger Buns', 'Dragon Fruit', 'Eggs', 'Apple', 'Apple', 'Hamburger Buns', 'Banana', 'Ice Pops'], 'Frank': ['Ice Pops', 'Carrot', 'Apple', 'Carrot', 'Dragon Fruit'], 'Alice': ['Eggs', 'Ice Pops', 'Eggs', 'Eggs', 'Hamburger Buns', 'Dragon Fruit', 'Dragon Fruit'], 'Ingrid': ['Banana', 'Banana', 'Ice Pops'], 'Bob': ['Eggs', 'Banana', 'Hamburger Buns', 'Dragon Fruit', 'Carrot', 'Dragon Fruit'], 'Gertrude': ['Hamburger Buns', 'Banana', 'Eggs', 'Ice Pops', 'Hamburger Buns', 'Eggs', 'Apple', 'Carrot', 'Eggs', 'Banana'], 'Dave': ['Apple', 'Ice Pops', 'Carrot', 'Carrot', 'Ice Pops', 'Hamburger Buns', 'Apple']}, 'Tuesday': {'Edith': ['Apple', 'Banana', 'Hamburger Buns', 'Carrot', 'Hamburger Buns', 'Apple'], 'Carol': ['Carrot', 'Banana', 'Banana', 'Dragon Fruit', 'Apple', 'Apple', 'Carrot', 'Carrot', 'Eggs', 'Banana'], 'Hannah': ['Hamburger Buns', 'Dragon Fruit', 'Eggs', 'Apple', 'Apple', 'Hamburger Buns', 'Banana', 'Ice Pops'], 'Frank': ['Ice Pops', 'Carrot', 'Apple', 'Carrot', 'Dragon Fruit'], 'Alice': ['Eggs', 'Ice Pops', 'Eggs', 'Eggs', 'Hamburger Buns', 'Dragon Fruit', 'Dragon Fruit'], 'Ingrid': ['Banana', 'Banana', 'Ice Pops'], 'Bob': ['Eggs', 'Banana', 'Hamburger Buns', 'Dragon Fruit', 'Carrot', 'Dragon Fruit'], 'Gertrude': ['Hamburger Buns', 'Banana', 'Eggs', 'Ice Pops', 'Hamburger Buns', 'Eggs', 'Apple', 'Carrot', 'Eggs', 'Banana'], 'Dave': ['Apple', 'Ice Pops', 'Carrot', 'Carrot', 'Ice Pops', 'Hamburger Buns', 'Apple']}, 'Wednesday': {'Edith': ['Apple', 'Banana', 'Hamburger Buns', 'Carrot', 'Hamburger Buns', 'Apple'], 'Carol': ['Carrot', 'Banana', 'Banana', 'Dragon Fruit', 'Apple', 'Apple', 'Carrot', 'Carrot', 'Eggs', 'Banana'], 'Hannah': ['Hamburger Buns', 'Dragon Fruit', 'Eggs', 'Apple', 'Apple', 'Hamburger Buns', 'Banana', 'Ice Pops'], 'Frank': ['Ice Pops', 'Carrot', 'Apple', 'Carrot', 'Dragon Fruit'], 'Alice': ['Eggs', 'Ice Pops', 'Eggs', 'Eggs', 'Hamburger Buns', 'Dragon Fruit', 'Dragon Fruit'], 'Ingrid': ['Banana', 'Banana', 'Ice Pops'], 'Bob': ['Eggs', 'Banana', 'Hamburger Buns', 'Dragon Fruit', 'Carrot', 'Dragon Fruit'], 'Gertrude': ['Hamburger Buns', 'Banana', 'Eggs', 'Ice Pops', 'Hamburger Buns', 'Eggs', 'Apple', 'Carrot', 'Eggs', 'Banana'], 'Dave': ['Apple', 'Ice Pops', 'Carrot', 'Carrot', 'Ice Pops', 'Hamburger Buns', 'Apple']}, 'Thursday': {'Edith': ['Apple', 'Banana', 'Hamburger Buns', 'Carrot', 'Hamburger Buns', 'Apple'], 'Carol': ['Carrot', 'Banana', 'Banana', 'Dragon Fruit', 'Apple', 'Apple', 'Carrot', 'Carrot', 'Eggs', 'Banana'], 'Hannah': ['Hamburger Buns', 'Dragon Fruit', 'Eggs', 'Apple', 'Apple', 'Hamburger Buns', 'Banana', 'Ice Pops'], 'Frank': ['Ice Pops', 'Carrot', 'Apple', 'Carrot', 'Dragon Fruit'], 'Alice': ['Eggs', 'Ice Pops', 'Eggs', 'Eggs', 'Hamburger Buns', 'Dragon Fruit', 'Dragon Fruit'], 'Ingrid': ['Banana', 'Banana', 'Ice Pops'], 'Bob': ['Eggs', 'Banana', 'Hamburger Buns', 'Dragon Fruit', 'Carrot', 'Dragon Fruit'], 'Gertrude': ['Hamburger Buns', 'Banana', 'Eggs', 'Ice Pops', 'Hamburger Buns', 'Eggs', 'Apple', 'Carrot', 'Eggs', 'Banana'], 'Dave': ['Apple', 'Ice Pops', 'Carrot', 'Carrot', 'Ice Pops', 'Hamburger Buns', 'Apple']}, 'Friday': {'Edith': ['Apple', 'Banana', 'Hamburger Buns', 'Carrot', 'Hamburger Buns', 'Apple'], 'Carol': ['Carrot', 'Banana', 'Banana', 'Dragon Fruit', 'Apple', 'Apple', 'Carrot', 'Carrot', 'Eggs', 'Banana'], 'Hannah': ['Hamburger Buns', 'Dragon Fruit', 'Eggs', 'Apple', 'Apple', 'Hamburger Buns', 'Banana', 'Ice Pops'], 'Frank': ['Ice Pops', 'Carrot', 'Apple', 'Carrot', 'Dragon Fruit'], 'Alice': ['Eggs', 'Ice Pops', 'Eggs', 'Eggs', 'Hamburger Buns', 'Dragon Fruit', 'Dragon Fruit'], 'Ingrid': ['Banana', 'Banana', 'Ice Pops'], 'Bob': ['Eggs', 'Banana', 'Hamburger Buns', 'Dragon Fruit', 'Carrot', 'Dragon Fruit'], 'Gertrude': ['Hamburger Buns', 'Banana', 'Eggs', 'Ice Pops', 'Hamburger Buns', 'Eggs', 'Apple', 'Carrot', 'Eggs', 'Banana'], 'Dave': ['Apple', 'Ice Pops', 'Carrot', 'Carrot', 'Ice Pops', 'Hamburger Buns', 'Apple']}}
我希望生成图表展示每人每周各类物品的总购买量(例如Edith本周购买X个Apple)。目前编写了如下代码,但计数结果不符合预期,同时不确定适合生成图表的数据结构是什么:
def itemCounter(lst,i): #INPUT: item list and items #OUTPUT: count times someone bought a particular item count = 0 for ele in lst: if (ele ==i): count = count + 1 return count for day, day_values in daily_purchases.items(): for name, items in day_values.items(): for item in items: item = itemCounter(i) items = itemCounter(last)
请问为何计数函数无法返回正确值?适合生成该图表的数据结构是什么?
一、计数函数错误原因
return语句位置错误:return count写在了for循环内部,导致循环只执行一次就直接返回结果。无论第一个元素是否匹配目标物品,函数都会立刻返回初始的0或者加1后的1,根本不会遍历整个列表统计总数。- 循环调用逻辑混乱:外层三层循环里,
itemCounter(i)和itemCounter(last)中的i、last都是未定义的变量,而且每次循环都把item和items重新赋值为函数返回值,完全没有实现累加统计每周总量的逻辑。 - 重复造轮子:Python列表本身自带
count()方法,可以直接统计元素出现次数,没必要自己写有bug的计数函数。
二、适合生成图表的数据结构
1. 嵌套字典结构
最直观的是用户为外层键,物品为内层键,值为总购买量的结构,示例如下:
user_item_totals = { "Edith": {"Apple": 10, "Banana": 5, "Hamburger Buns": 10, ...}, "Carol": {"Carrot": 20, "Banana": 15, "Dragon Fruit":5, ...}, ... }
这种结构清晰对应“每人-每类物品-总数量”的需求,方便后续提取数据生成图表。
2. 扁平化列表(适配可视化库)
如果使用Matplotlib、Seaborn或Plotly这类可视化工具,扁平化的列表(每一行是一条用户-物品-数量的记录)更便于处理,示例如下:
flat_data = [ {"user": "Edith", "item": "Apple", "total": 10}, {"user": "Edith", "item": "Banana", "total": 5}, {"user": "Carol", "item": "Carrot", "total": 20}, ... ]
也可以直接转换为Pandas的DataFrame,这是可视化工具最常用的数据格式,能快速生成分组柱状图、堆叠图等。
修正后的统计代码示例
# 初始化统计字典 user_item_totals = {} for day, day_records in daily_purchases.items(): for user, items in day_records.items(): # 如果用户不在统计字典中,先创建空字典 if user not in user_item_totals: user_item_totals[user] = {} # 遍历当天购买的物品,累加计数 for item in items: if item in user_item_totals[user]: user_item_totals[user][item] += 1 else: user_item_totals[user][item] = 1 # 转换为扁平化列表(可选,用于可视化) flat_data = [] for user, items in user_item_totals.items(): for item, count in items.items(): flat_data.append({"user": user, "item": item, "total": count}) print(user_item_totals["Edith"]) # 输出示例:{'Apple': 10, 'Banana': 5, 'Hamburger Buns': 10, 'Carrot': 5}
内容的提问来源于stack exchange,提问作者user20481823
相关产品推荐
相关产品推荐

