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:

notEnoughUnpack

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.

Leave a Reply

Your email address will not be published. Required fields are marked *