python ValueError: too many values to unpack in tuple

KameeCoding picture KameeCoding · Jan 21, 2015 · Viewed 8.5k times · Source

So I am extracting data from a JSON file.

I am trying to pack my data in a way so a preprocessing script can use it.

preprocessing script code:

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

Now I have an extracted dataset into a Dictionary like this:

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

So I have

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

And when I try to replicate the original code I get the Too many values to unpack error

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)

OUTPUT:

(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

As you can see I even tried limiting the right side of the assignment but that didn't help either

and as you can see the output matches as it should for each item

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

And len(hist) returns 3 also.

Why the hell is this happening? Having hist,hist[:3],hist[0:3] has the same result, Too many values to unpack error.

Answer

J Richard Snape picture J Richard Snape · Jan 21, 2015

What you want is

text, ans, qid = hist
print(text)

instead of

for text, ans, qid in hist:

Think about what hist represents - it is a single tuple (because you've looked it up with key)

That means that

for text, ans, qid in hist:

is trying to iterate through each member of the tuple and break them into those three components. So, first, it tries to act on hist[0] i.e. "This type of year...." and tries to break it into text, ans and qid. Python recognises that the string could be broken up (into characters), but can't work out how to break it into those three components as there are far more characters. So it throws the Error 'Too many values to unpack'