python ValueError:要在元组中解压缩的值太多

时间:2015-01-21 15:10:19

标签: python json tuples unpack

所以我从json文件中提取数据,我打算将其提供给第三方程序Qanta,这是一个RNN。

不管怎样,我试图以某种方式打包我的数据,以便Qanta的预处理脚本可以使用它。

来自qanta的代码:

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

现在我从json文件中获取了一个关于危险问题解答的提取数据集,并将其打包成一个字典,如下所示:

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

当我尝试从qanta复制原始代码时,我得到太多的值来解压错误

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]有相同的结果,解包错误的值太多。

3 个答案:

答案 0 :(得分:6)

你想要的是

text, ans, qid = hist
print(text)

而不是

for text, ans, qid in hist:

考虑hist代表的内容 - 它是一个单元组(因为您已经使用key查找了它)

这意味着

for text, ans, qid in hist:

正在尝试遍历元组的每个成员并将它们分解为这三个组件。所以,首先,它试图对hist [0]进行操作,即&#34;这种类型的年份......&#34;并尝试将其分为textansqid。 Python认识到字符串可以被分解(转换为字符),但是可以解决如何将其分解为这三个组件,因为有更多的字符。因此它会抛出错误'Too many values to unpack'

答案 1 :(得分: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)

答案 2 :(得分:1)

改变这个:

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

到此:

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

hist [x:y]是来自hist的所有元素,x&lt; = ids&lt; y

编辑:

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

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

但你可以使用它(为我工作):

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