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

Python字典键拆分重构时出现ValueError: too many values to unpack (expected 2)错误的求助

字典重构时的ValueError问题分析与解决方案

先来说说你遇到的问题:你想用字典推导式把原字典按类别拆分重组,但不仅没得到想要的结果,还抛出了ValueError: too many values to unpack (expected 2)。我来帮你拆解一下问题出在哪,以及怎么解决。

错误根源分析

你写的代码是:

items_count2 = {k.split(':')[0]: {k.split(':')[1]: v} for k, v in items_count}

这里有两个关键问题:

  1. 遍历方式错误:直接遍历字典items_count时,迭代的是字典的键,而不是键值对。举个例子,第一次循环拿到的是'1111:271',代码却试图把这个单个字符串拆成k和v两个变量,这必然会触发"拆包数量不匹配"的错误。正确的遍历键值对应该用items_count.items()。
  2. 无法合并同类别数据:就算你修正了遍历方式,这个推导式也达不到你的需求。因为同一个类别(比如'1111')会被多次赋值,后面的内层字典会完全覆盖前面的,最终每个类别只会保留最后一个id的键值对,而不是把所有同类别id合并到一个内层字典里。

正确的实现方法

要完成你的需求,我们需要逐个处理每个键值对,把同类别下的id和计数合并到同一个内层字典中。这里有两种常用的方式:

方式一:普通循环构建字典

这种方式直观易懂,适合新手:

items_count = { '1111:271': 111, '1111:190': 3, '1231:106': 13, '1211:104': 111, '1111:201': 9 }
items_count2 = {}

for key, value in items_count.items():
    # 拆分键为类别和id
    category, item_id = key.split(':')
    # 如果类别还没在新字典里,先创建一个空的内层字典
    if category not in items_count2:
        items_count2[category] = {}
    # 把当前id和计数添加到对应类别下
    items_count2[category][item_id] = value

# 如果你确实需要把某个id的计数设为0(比如你示例里的'201':0,原数据是9可能是笔误),可以单独赋值:
# items_count2['1111']['201'] = 0

方式二:用collections.defaultdict简化操作

如果你不想每次都判断类别是否存在,可以用defaultdict来自动创建内层字典:

from collections import defaultdict

items_count = { '1111:271': 111, '1111:190': 3, '1231:106': 13, '1211:104': 111, '1111:201': 9 }
# 初始化一个默认值为空字典的外层字典
items_count2 = defaultdict(dict)

for key, value in items_count.items():
    category, item_id = key.split(':')
    items_count2[category][item_id] = value

# 可选:如果需要把defaultdict转成普通字典
items_count2 = dict(items_count2)

这两种方式都能帮你得到想要的字典结构,而且不会出现拆包错误。

内容的提问来源于stack exchange,提问作者Les_Grosman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 12:27:46