python ValueError:在元组中解包的值太多

Posted

技术标签:

【中文标题】python ValueError:在元组中解包的值太多【英文标题】:python ValueError: too many values to unpack in tuple 【发布时间】:2015-01-21 15:10:18 【问题描述】:

所以我从 JSON 文件中提取数据。

我正在尝试以某种方式打包我的数据,以便预处理脚本可以使用它。

预处理脚本代码:

for key in split:
    hist = split[key]
    for text, ans, qid in hist:

现在我将提取的数据集放入字典中,如下所示:

dic
result //is the result of removing some formatting elements and stuff from the Question, so is a question string
answer //is the answer for the Q
i // is the counter for Q & A pairs

所以我有

this = (result,answer,i)
dic[this]=this

当我尝试复制原始代码时,我得到 Too many values to unpack 错误

for key in dic:
    print(key)
    hist = dic[key]
    print(hist[0])
    print(hist[1])
    print(hist[2])
    for text, ans, qid in hist[0:2]:  // EDIT: changing this to hist[0:3] or hist has no effect
        print(text)

输出:

(u'This type of year happens once every four', u'leap', 1175)
This type of year happens once every four
leap
1175
Traceback (most recent call last):
  File "pickler.py", line 34, in <module>
    for text, ans, qid in hist[0:2]:
ValueError: too many values to unpack

如您所见,我什至尝试限制作业的右侧,但这也无济于事

正如你所看到的,每个项目的输出都应该匹配

hist[0]=This type of year happens once every four
hist[1]=leap
hist[2]=1175

len(hist) 也返回 3。

为什么会发生这种情况?具有 hist,hist[:3],hist[0:3] 有相同的结果,太多的值来解包错误。

【问题讨论】:

您能否更正示例代码的缩进级别,以便我们可以看到代码块?谢谢! 【参考方案1】:

你想要的是

text, ans, qid = hist
print(text)

而不是

for text, ans, qid in hist:

想想hist 代表什么——它是一个单一的元组(因为你已经用key 查过了)

也就是说

for text, ans, qid in hist:

试图遍历元组的每个成员并将它们分解为这三个组件。因此,首先,它尝试对 hist[0] 进行操作,即“这种类型的年份......”并尝试将其分解为 textansqid。 Python 认识到字符串可以被分解(成字符),但由于字符多得多,因此无法弄清楚如何将其分解成这三个部分。所以它抛出错误'Too many values to unpack'

【讨论】:

同样的结果@JRichardSnape 对不起 - 我掉进了一个非常愚蠢的陷阱 - 请参阅修改后的答案。另请注意 - @rchang 是对的 - 他不建议您迭代 hist[0:3] 赞成清楚地解释解包错误的来源。 :)【参考方案2】:

您的循环试图做的是遍历hist 的前三项并将它们中的每一项单独解释为三元素元组。我猜你想要做的是这样的:

for key in dic:
    hist = dic[key]
    (text, ans, qid) = hist[0:3] # Might not need this slice notation if you are sure of the number of elements
    print(text)

【讨论】:

@Kameegaming 我尝试尽可能多地复制您的情况:repl.it/8aC(单击“运行会话”)。我忽略了什么吗? 似乎是正确的,这个确实有效,即使我将 [0:3] 排除在外,但不适用于 for,这很奇怪,呵呵 好答案。请参阅我稍长的解释为什么它不适用于for【参考方案3】:

改变这个:

for text, ans, qid in hist[0:2]:

到这里:

for text, ans, qid in hist[0:3]:

hist[x:y] 是 hist 中 x 的所有元素

编辑:

正如@J Richard Snape 和@rchang 所指出的,你不能使用这个:

for text, ans, qid in hist[0:3]:

但您可以改用它(对我有用):

for text, ans, qid in [hist[0:3]]:

【讨论】:

同样的结果@JasonPap

以上是关于python ValueError:在元组中解包的值太多的主要内容,如果未能解决你的问题,请参考以下文章

ValueError:没有足够的值来解包(预期为 2,得到 1)当试图在 python 中解包 dict 以使用 pandas 进行数据标记时

在 python 中解包一个元组并对其进行迭代

Python:在元组中存储许多正则表达式匹配?

grep或在元组中搜索字符串 - python

ValueError:解包的值太多(Python 2.7)

OpenCV python:ValueError:解包的值太多