13.3. Tuple Assignment with Unpacking¶
Python has a very powerful tuple assignment feature that allows a tuple of variable names on the left of an assignment statement to be assigned values from a tuple on the right of the assignment. Another way to think of this is that the tuple of values is unpacked into the variable names.
This does the equivalent of seven assignment statements, all on one easy line.
Naturally, the number of variables on the left and the number of values on the right have to be the same.
Note
Unpacking into multiple variable names also works with lists, or any other sequence type, as long as there is exactly one value for each variable. For example, you can write x, y = [3, 4]
.
13.3.1. Swapping Values between Variables¶
This feature is used to enable swapping the values of two variables. With conventional assignment statements, we have to
use a temporary variable. For example, to swap a
and b
:
Tuple assignment solves this problem neatly:
The left side is a tuple of variables; the right side is a tuple of values. Each value is assigned to its respective variable. All the expressions on the right side are evaluated before any of the assignments. This feature makes tuple assignment quite versatile.
13.3.2. Unpacking Into Iterator Variables¶
Multiple assignment with unpacking is particularly useful when you iterate through a list of tuples. You can unpack each tuple into several loop variables. For example:
On the first iteration the tuple ('Paul', 'Resnick')
is unpacked into the two variables first_name
and last_name
. One the second iteration, the next tuple is unpacked into those same loop variables.
13.3.3. The Pythonic Way to Enumerate Items in a Sequence¶
When we first introduced the for loop, we provided an example of how to iterate through the indexes of a sequence, and thus enumerate the items and their positions in the sequence.
We are now prepared to understand a more pythonic approach to enumerating items in a sequence. Python provides a built-in function enumerate
. It takes a sequence as input and returns a sequence of tuples. In each tuple, the first element is an integer and the second is an item from the original sequence. (It actually produces an “iterable” rather than a list, but we can use it in a for loop as the sequence to iterate over.)
The pythonic way to consume the results of enumerate, however, is to unpack the tuples while iterating through them, so that the code is easier to understand.
Check your Understanding
- You can't use different variable names on the left and right side of an assignment statement.
- Sure you can; you can use any variable on the right-hand side that already has a value.
- At the end, x still has it's original value instead of y's original value.
- Once you assign x's value to y, y's original value is gone.
- Actually, it works just fine!
- Once you assign x's value to y, y's original value is gone.
Consider the following alternative way to swap the values of variables x and y. What’s wrong with it?
# assume x and y already have values assigned to them
y = x
x = y
With only one line of code, assign the variables water
, fire
, electric
, and grass
to the values “Squirtle”, “Charmander”, “Pikachu”, and “Bulbasaur”
With only one line of code, assign four variables, v1
, v2
, v3
, and v4
, to the following four values: 1, 2, 3, 4.
If you remember, the .items() dictionary method produces a sequence of tuples. Keeping this in mind, we have provided you a dictionary called pokemon
. For every key value pair, append the key to the list p_names
, and append the value to the list p_number
. Do not use the .keys() or .values() methods.
The .items() method produces a sequence of key-value pair tuples. With this in mind, write code to create a list of keys from the dictionary track_medal_counts
and assign the list to the variable name track_events
. Do NOT use the .keys() method.