Python 3 – ValueError: not enough values to unpack (expected 3, got 2)
Python 3 – ValueError: not enough values to unpack (expected 3, got 2)
You probably want to assign the lastname
you are reading out here
lastname = sheet.cell(row=r, column=3).value
to something; currently the program just forgets it
you could do that two lines after, like so
unpaidMembers[name] = lastname, email
your program will still crash at the same place, because .items()
still wont give you 3-tuples but rather something that has this structure: (name, (lastname, email))
good news is, python can handle this
for name, (lastname, email) in unpaidMembers.items():
etc.
In this line:
for name, email, lastname in unpaidMembers.items():
unpaidMembers.items()
must have only two values per iteration.
Here is a small example to illustrate the problem:
This will work:
for alpha, beta, delta in [(first, second, third)]:
print(alpha:, alpha, beta:, beta, delta:, delta)
This will fail, and is what your code does:
for alpha, beta, delta in [(first, second)]:
print(alpha:, alpha, beta:, beta, delta:, delta)
In this last example, what value in the list is assigned to delta
? Nothing, There arent enough values, and that is the problem.
Python 3 – ValueError: not enough values to unpack (expected 3, got 2)
1. First should understand the error meaning
Error not enough values to unpack (expected 3, got 2)
means:
a 2 part tuple, but assign to 3 values
and I have written demo code to show for you:
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Function: Showing how to understand ValueError not enough values to unpack (expected 3, got 2)
# Author: Crifan Li
# Update: 20191212
def notEnoughUnpack():
Showing how to understand python error `not enough values to unpack (expected 3, got 2)`
# a dict, which single keys value is two part tuple
valueIsTwoPartTupleDict = {
name1: (lastname1, email1),
name2: (lastname2, email2),
}
# Test case 1: got value from key
gotLastname, gotEmail = valueIsTwoPartTupleDict[name1] # OK
print(gotLastname=%s, gotEmail=%s % (gotLastname, gotEmail))
# gotLastname, gotEmail, gotOtherSomeValue = valueIsTwoPartTupleDict[name1] # -> ValueError not enough values to unpack (expected 3, got 2)
# Test case 2: got from dict.items()
for eachKey, eachValues in valueIsTwoPartTupleDict.items():
print(eachKey=%s, eachValues=%s % (eachKey, eachValues))
# same as following:
# Background knowledge: each of dict.items() return (key, values)
# here above eachValues is a tuple of two parts
for eachKey, (eachValuePart1, eachValuePart2) in valueIsTwoPartTupleDict.items():
print(eachKey=%s, eachValuePart1=%s, eachValuePart2=%s % (eachKey, eachValuePart1, eachValuePart2))
# but following:
for eachKey, (eachValuePart1, eachValuePart2, eachValuePart3) in valueIsTwoPartTupleDict.items(): # will -> ValueError not enough values to unpack (expected 3, got 2)
pass
if __name__ == __main__:
notEnoughUnpack()
using VSCode
debug effect:
2. For your code
for name, email, lastname in unpaidMembers.items():
but error
ValueError: not enough values to unpack (expected 3, got 2)
means each item(a tuple value) in unpaidMembers
, only have 1 parts:email
, which corresponding above code
unpaidMembers[name] = email
so should change code to:
for name, email in unpaidMembers.items():
to avoid error.
But obviously you expect extra lastname
, so should change your above code to
unpaidMembers[name] = (email, lastname)
and better change to better syntax:
for name, (email, lastname) in unpaidMembers.items():
then everything is OK and clear.