Python Forum

Full Version: valueError too many values to unpack
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Can anyone tell me what I am doing wrong, I thought this was something you could do in python

a, b = input("Enter two numbers> ")
You have 2 options:

1.
a, b = input("Enter two numbers> "), input("Enter two numbers> ")

2.
a = input("Enter two numbers> ")
a = a.split(' ')

# a becomes a list of 2 strings ['1', '2']
# You will have to convert those to integers.
What version of Python are you using? What are you providing when input() asks for two numbers?

It looks like you're using Python 3, and I'll imagine an input like so
Output:
>>> a, b = input("> ") > 1 2 Traceback (most recent call last):  File "<stdin>", line 1, in <module> ValueError: too many values to unpack (expected 2)
Recall that input() gives you a string, so the way the code works is much like this
Output:
>>> a, b = "1 2" Traceback (most recent call last):  File "<stdin>", line 1, in <module> ValueError: too many values to unpack (expected 2)
Python isn't trying to interpret the contents of the string as integers here.
Output:
>>> a, b = "12" >>> a '1' >>> b '2'
What you could do is get the string from input(), use str.split (based on whether you want to use whitespace, commas, or whatever) and then use a comprehension on that split string to turn the contents into ints, or floats.
(Apr-23-2017, 06:10 PM)idontreallywolf Wrote: [ -> ]a, b = input("Enter two numbers> "), input("Enter two numbers> ")
That behavior would cause the prompt to happen twice, so it would be like you were asking for four numbers.

(Apr-23-2017, 06:10 PM)idontreallywolf Wrote: [ -> ]a = input("Enter two numbers> ") a = a.split(' ') # a becomes a list of 2 integers ['1', '2']
As the list there shows, it's a list of strings, not ints. Another step is required to turn the strings into ints.
(Apr-23-2017, 06:17 PM)micseydel Wrote: [ -> ]
(Apr-23-2017, 06:10 PM)idontreallywolf Wrote: [ -> ]a, b = input("Enter two numbers> "), input("Enter two numbers> ")
That behavior would cause the prompt to happen twice, so it would be like you were asking for four numbers.

(Apr-23-2017, 06:10 PM)idontreallywolf Wrote: [ -> ]a = input("Enter two numbers> ") a = a.split(' ') # a becomes a list of 2 integers ['1', '2']
As the list there shows, it's a list of strings, not ints. Another step is required to turn the strings into ints.

Indeed, I have forgotten to edit the text inside.

isn't it obvious that the last step requires conversion from str to int?
Hello!
When you ask for an input what you get is a single string object. What is happening when Python unpack the numbers is to attempt to assign each symbol to the variables. If you type 1 2 as an input, the length of the string is 3 - '1', ' ', '2'. So you have three values to unpack to two variables. You have two options. To add split() at the end of the input(). To get the string and unpacking it after the input.

Here is what is happening:

In [1]: a, b = input("Enter two numbers> ")

Enter two numbers> 1 2 # three symbols
Error:
ValueError                                Traceback (most recent call last) <ipython-input-1-88647334f199> in <module>() ----> 1 a, b = input("Enter two numbers> ") ValueError: too many values to unpack (expected 2)
In [2]: a, b = input("Enter two numbers> ").split()
Enter two numbers> 1 2 # three symbols

In [3]: a, b = input("Enter two numbers> ")
Enter two numbers> 12 # two symbols

In [4]: print(a, b)
1 2
Still, the type of the a and b is string. You have to int() it.
Thanks all, I thought it would be simple. In this particular case, I just needed the variables to take a value, and to end up with two strings is good enough. Solution was as follows:
a_str, b_str = input("Enter two numbers> ").split()
a_int = int(a)
b_int = int(b)
Split returns strings, hence the conversion afterwards.
What's with the hungarian notation?  Do you really need both the string and int?  Or can you just use the same variables?

Also, instead of doing the conversion for each variable on it's own line, you could just do both at once:
>>> a, b = map(int, input("> ").split())
> 42 3
>>> a
42
>>> b
3
>>>