Question

Using split in a for loop results in the mentioned exception. But when taking the elements indpendent from a for loop it works:

>>> for k,v in x.split("="):
...   print k,v
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many values to unpack
>>> y =  x.split("=")
>>> y
['abc', 'asflskfjla']
>>> k,v = y
>>> k
'abc'
>>> v
'asflskfjla'

An explanation would be appreciated - and also naturally the proper syntax for the for loop version.

Was it helpful?

Solution

The for loop expects that each item in the iterable can be unpacked into two variables. So in your case, it'd look something like one of these:

[('a, b'), ('c, d'), ...]
[['a, b'], ['c, d'], ...]
['ab', 'cd', ...]
...

Each item in each of those iterables can be split up into a k and a v component. In your case, they cannot, as the output of x.split('=') is a list of strings with more than two characters:

['abc', 'asflskfjla']

OTHER TIPS

x.split returns a list of strings, as you can see from your y variable. When you iterate over that, it takes the first element of the list 'abc' and tries to bind it to the tuple k, v. Since strings are a sequence type, it tries to assign the characters of the string to the tuple you've asked for - and there are in fact too many values (three letters) to unpack into a two-element tuple.

If you wanted this behavior just wrap s.split() in a list:

>>> for (k,v) in [s.split("=")]:
    print(k,v)  
('abc', 'asflskfjla')
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top