One can unpack an N-element tuple or iterable sequence into a collection of n-variables by using the following pattern. It's important to note that the number of variables and elements in the sequence need to match. Below is a list with a string, int, float, and a tuple. Variables are paired with data in the same order from left to right.
data = ['Carolin', 50, 98.7, (2017, 3, 20)]
name, age, temp, date = data
This doesn't only apply to tuples and lists; it can be any iterable object. In this case, we have a string and each letter is assigned to a letter variable.
s = 'Test'
a, b, c, d = s
print(a)
We can see that printing the variable a produces the first letter in our string.
T
If you you have more items in your sequence than you do variables, you'll get a warning letting you know that you have too many. Here, the traceback message is pretty clear.
data = ['Carolin', 50, 98.7, (2017, 3, 20)]
name, age, temp = data
ValueError Traceback (most recent call last)
<ipython-input-2-b1385ed3051e> in
ValueError: too many values to unpack (expected 3)
On the other hand, if you have too many variables, but not enough items in your sequence, the traceback will let you know that it expected more from the sequence, but only got x number.
data = ['Carolin', 50, 98.7, (2017, 3, 20)]
name, age, temp, date, time = data
ValueError Traceback (most recent call last)
<ipython-input-3-3c6a6bafdea4> in
ValueError: not enough values to unpack (expected 5, got 4)
You can even unpack a sequence inside of a sequence. In this case, you simply need to assign variables to each piece of data in the tuple.
data = ['Carolin', 50, 98.7, (2017, 3, 20)]
name, age, temp, (year, mon, day) = data
print('Name: ', name)
print('Year: ', year)
print('Month: ', mon)
print('Day: ', day)
Name: Carolin
Year: 2017
Month: 3
Day: 20
If you want to delete some of the valuables, you can get rid of them by assigning them to a throwaway variable.
data = ['Carolin', 50, 98.7, (2017, 3, 20)]
_, age, temp, _ = data
print('Age: ', age)
print('Temperature: ', temp)
Age: 50
Temperature: 98.7
What if you don't know how long the list is? You can add an asterix. In this case, Python is able to assign the first and last variables automatically, and fills the middle variables by using the asterix notation. Here, you can add or remove as many numbers as you like and the function will drop the first and last and find the mean of the remaining numbers in the middle.
from statistics import mean
grades = (4, 6, 5, 2, 5, 9, 5, 8, 9, 6, 7, 5)
def drop_first_last(grades):
first, *middle, last = grades
return mean(middle)
print('Mean: ', drop_first_last(grades))
Mean: 6.2
Here is an example. I deleted a few of the numbers from the middle and the function still works just fine.
from statistics import mean
grades = (4, 6, 5, 2, 5, 9, 6, 7, 5)
def drop_first_last(grades):
first, *middle, last = grades
return mean(middle)
print('Mean: ', drop_first_last(grades))
Mean: 5.714285714285714
You can also apply this elsewhere, where you're not sure how many of something you'll have. In this context, you may want to store multiple phone numbers. In this example, the first varialbe is associated with a name, the second with an email, and every entry afterwards will be associated with the phone_numbers variable.
contacts = ('Charlotte', 'choconana@test.com', '01515251112',
'0165492255589')
name, email, *phone_numbers = contacts
cell, home = phone_numbers
print('Name: ', name)
print('Email: ', email)
print('Phone Numbers: ', phone_numbers)
print('Cell phone: ', cell)
print('Home phone: ', home)
You can see the phone_numbers variable will return a list unless you use the pattern to match the contents. If you don't have consistent or clean data, you may end up with a traceback if you try unpacking right away.
Name: Charlotte
Email: choconana@test.com
Phone Numbers: ['01515251112', '0165492255589']
Cell phone: 01515251112
Home phone: 0165492255589
You can also use star notation to unpack and throw away variables like we did before.
data = ['Carolin', 50, 98.7, (2017, 3, 20)]
name, *_, (year, *_) = data
print('Name: ', name)
print('Date: ', year)
Name: Carolin
Date: 2017