You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 18:05:38