5. Unpacking sequences

5.1. Unpacking values

a, b, c = 1, 2, 3
a, b, c = (1, 2, 3)
a, b, c = [1, 2, 3]
a, b, c = {1, 2, 3}

Note

Note, that set is unordered collection!

5.1.1. Too many values to unpack

a, b, c = [1, 2, 3, 4]
# ValueError: too many values to unpack (expected 3)

5.1.2. Not enough values to unpack

a, b, c, d = [1, 2, 3]
# ValueError: not enough values to unpack (expected 4, got 3)

5.2. Unpacking arbitrary number of arguments

5.2.1. Unpacking values at the right side

a, b, *c = [1, 2, 3, 4]

a           # 1
b           # 2
c           # [3, 4]

5.2.2. Unpacking values at the left side

*a, b, c = [1, 2, 3, 4]

a           # [1, 2]
b           # 3
c           # 4

5.2.3. Unpacking values from both sides at once

a, *b, c = [1, 2, 3, 4]

a           # 1
b           # [2, 3]
c           # 4

5.2.4. Cannot unpack from both sides at once

*a, b, *c = [1, 2, 3, 4]
# SyntaxError: two starred expressions in assignment

5.3. Naming convention

  • if you're not using in those values later in your code

first, *middle, last = [1, 2, 3, 4]

first           # 1
middle          # [2, 3]
last            # 4
line = '4.9,3.1,1.5,0.1,setosa'

*_, species = line.split(',')

species         # setosa
line = 'twardowski:x:1001:1001:Jan Twardowski:/home/twardowski:/bin/bash'

username, _, _, _, full_name, *_ = line.split(':')

username        # twardowski
full_name       # Jan Twardowski
line = 'twardowski:x:1001:1001:Jan Twardowski:/home/twardowski:/bin/bash'

username, *_, home, _ = line.split(':')

username        # twardowski
home            # /home/twardowski

5.4. Examples

line = '4.9,3.1,1.5,0.1,setosa'

*measurements, species = line.split(',')

measurements        # ['4.9', '3.1', '1.5', '0.1']
species             # 'setosa'
line = 'astronauts,twardowski,watney,ivanovic'

group_name, *members = line.split(',')

group_name      # astronauts
members         # ['twardowski', 'watney', 'ivanovic']
a, b, *c = range(10)

a       # 0
b       # 1
c       # [2, 3, 4, 5, 6, 7, 8, 9]

5.5. More advanced topics

Note

The topic will be continued in Intermediate and Advanced part of the book

5.6. Assignments

5.6.1. Unpacking from sequence

  1. Dany jest ciąg znaków:

    '10.13.37.1      nasa.gov esa.int roscosmos.ru'
    
  2. Podziel go po białych znakach i wydostań wartości:

    • ip: str

    • hosts: List[str]

  3. Przy parsowaniu linii skorzystaj z konstrukcji z gwiazdką *

5.6.2. Unpacking from nested sequence

  1. Dany jest zbiór:

    DATA = [
        ('Sepal length', 'Sepal width', 'Petal length', 'Petal width', 'Species'),
        (5.8, 2.7, 5.1, 1.9, 'virginica'),
        (5.1, 3.5, 1.4, 0.2, 'setosa'),
        (5.7, 2.8, 4.1, 1.3, 'versicolor'),
        (6.3, 2.9, 5.6, 1.8, 'virginica'),
        (6.4, 3.2, 4.5, 1.5, 'versicolor'),
        (4.7, 3.2, 1.3, 0.2, 'setosa'),
        (7.0, 3.2, 4.7, 1.4, 'versicolor'),
        (7.6, 3.0, 6.6, 2.1, 'virginica'),
        (4.9, 3.0, 1.4, 0.2, 'setosa'),
        (4.9, 2.5, 4.5, 1.7, 'virginica'),
        (7.1, 3.0, 5.9, 2.1, 'virginica'),
        (4.6, 3.4, 1.4, 0.3, 'setosa'),
        (5.4, 3.9, 1.7, 0.4, 'setosa'),
        (5.7, 2.8, 4.5, 1.3, 'versicolor'),
        (5.0, 3.6, 1.4, 0.3, 'setosa'),
        (5.5, 2.3, 4.0, 1.3, 'versicolor'),
        (6.5, 3.0, 5.8, 2.2, 'virginica'),
        (6.5, 2.8, 4.6, 1.5, 'versicolor'),
        (6.3, 3.3, 6.0, 2.5, 'virginica'),
        (6.9, 3.1, 4.9, 1.5, 'versicolor'),
        (4.6, 3.1, 1.5, 0.2, 'setosa'),
    ]
    
  2. Ze zbioru oddziel nagłówek i dane:

    • header: Tuple[str]

    • data: List[tuple]

  3. Przy podziale skorzystaj z konstrukcji z gwiazdką *