DEV Community

Super Kai (Kazuya Ito)
Super Kai (Kazuya Ito)

Posted on • Edited on

Unpacking in Python (4)

Buy Me a Coffee

*Memo:

  • My post explains the unpacking with a for statement (1).
  • My post explains the unpacking with an assignment statement (1).
  • My post explains the unpacking with an assignment statement (2).
  • My post explains the iterable unpacking with * and a function (1).
  • My post explains the iterable unpacking with * and a function (2).
  • My post explains the dictionary unpacking with ** within a dictionary and function.

Iterable and dictionary unpacking can be done with * and ** respectively and with a for statement as shown below:

for v1, *v2, v3 in [[0, 1, 2, 3, 4, 5],               # list(list)
                    [6, 7, 8, 9, 10, 11]]:
# list(list(*list(*list)))
# for v1, *v2, v3 in [[*[0, 1], 2, *[3, 4, *[5]]],
#                     [*[6, 7], 8, *[9, 10, *[11]]]]:
# for v1, *v2, v3 in ((0, 1, 2, 3, 4, 5),             # tuple(tuple)
#                     (6, 7, 8, 9, 10, 11)):
# tuple(tuple(*tuple(*tuple)))
# for v1, *v2, v3 in ((*(0, 1), 2, *(3, 4, *(5,))),
#                     (*(6, 7), 8, *(9, 10, *(11,)))):
# for v1, *v2, v3 in iter([iter([0, 1, 2, 3, 4, 5]),  # iterator(iterator)
#                          iter([6, 7, 8, 9, 10, 11])]):
# for v1, *v2, v3 in [range(6), range(6, 12)]:        # list(range)
    print(v1, v2, v3)
    print(v1, *v2, v3)
# 0 [1, 2, 3, 4] 5
# 0 1 2 3 4 5
# 6 [7, 8, 9, 10] 11
# 6 7 8 9 10 11

for v1, *v2, v3 in {frozenset({0, 1, 2, 3, 4, 5}),    # set(frozenset)
                    frozenset({6, 7, 8, 9, 10, 11})}:
# frozenset(frozenset)
# for v1, *v2, v3 in frozenset({frozenset({0, 1, 2, 3, 4, 5}),
#                               frozenset({6, 7, 8, 9, 10, 11})}):
    print(v1, v2, v3)
    print(v1, *v2, v3)
# 6 [7, 8, 9, 10] 11
# 6 7 8 9 10 11
# 0 [1, 2, 3, 4] 5
# 0 1 2 3 4 5

for v1, *v2, v3 in [{0:1, 2:3, 4:5, 6:7, 8:9, 10:11}, # list(dict)
                    {12:13, 14:15, 16:17, 18:19, 20:21, 22:23}]:
# list(dict(**dict(**dict)))
# for v1, *v2, v3 in [{**{0:1, 2:3}, 4:5, **{6:7, 8:9, **{10:11}}}, 
#                     {**{12:13, 14:15}, 16:17, **{18:19, 20:21, **{22:23}}}]:
# list(dict.keys())
# for v1, *v2, v3 in [{0:1, 2:3, 4:5, 6:7, 8:9, 10:11}.keys(), 
#                     {12:13, 14:15, 16:17, 18:19, 20:21, 22:23}.keys()]:
    print(v1, v2, v3)
    print(v1, *v2, v3)
# 0 [2, 4, 6, 8] 10
# 0 2 4 6 8 10
# 12 [14, 16, 18, 20] 22
# 12 14 16 18 20 22

# list(dict.values())
for v1, *v2, v3 in [{0:1, 2:3, 4:5, 6:7, 8:9, 10:11}.values(), 
                    {12:13, 14:15, 16:17, 18:19, 20:21, 22:23}.values()]:
    print(v1, v2, v3)
    print(v1, *v2, v3)
# 1 [3, 5, 7, 9] 11
# 1 3 5 7 9 11
# 13 [15, 17, 19, 21] 23
# 13 15 17 19 21 23

# list(dict.items())
for v1, *v2, v3 in [{0:1, 2:3, 4:5, 6:7, 8:9, 10:11}.items(),  
                    {12:13, 14:15, 16:17, 18:19, 20:21, 22:23}.items()]:
    print(v1, v2, v3)
    print(v1, *v2, v3)
# (0, 1) [(2, 3), (4, 5), (6, 7), (8, 9)] (10, 11)
# (0, 1) (2, 3) (4, 5) (6, 7) (8, 9) (10, 11)
# (12, 13) [(14, 15), (16, 17), (18, 19), (20, 21)] (22, 23)
# (12, 13) (14, 15) (16, 17) (18, 19) (20, 21) (22, 23)

for v1, *v2, v3 in {'012345':'6789AB',                # dict
                    'CDEFGH':'IJKLMN'}:
# for v1, *v2, v3 in {'012345':'6789AB',              # dict.keys()
#                     'CDEFGH':'IJKLMN'}.keys():
    print(v1, v2, v3)
    print(v1, *v2, v3)
# 0 ['1', '2', '3', '4'] 5
# 0 1 2 3 4 5
# C ['D', 'E', 'F', 'G'] H
# C D E F G H

for v1, *v2, v3 in {'012345':'6789AB',                # dict.values()
                    'CDEFGH':'IJKLMN'}.values(): 
    print(v1, v2, v3)
    print(v1, *v2, v3)
# 6 ['7', '8', '9', 'A'] B
# 6 7 8 9 A B
# I ['J', 'K', 'L', 'M'] N
# I J K L M N

for v1, *v2, v3 in {'012345':'6789AB',                # dict.items()
                    'CDEFGH':'IJKLMN'}.items():
    print(v1, v2)
    print(v1, *v2)
# 012345 [] 6789AB
# 012345 Nothing 6789AB
# CDEFGH [] IJKLMN
# CDEFGH Nothing IJKLMN

for v1, v2, v3 in [b'012', b'345']:                    # list(bytes)
# for v1, v2, v3 in [bytearray(b'012'),                # list(bytearray)
#                    bytearray(b'345')]:
    print(v1, v2, v3)
# 48 49 50
# 51 52 53

for v1, v2, v3 in {b'012':b'345', b'678':b'9AB'}:      # dict
# for v1, v2, v3 in {b'012':b'345',                    # dict.keys()            
#                    b'678':b'9AB'}.keys():
# for v1, v2, v3 in {b'012':bytearray(b'345'),         # dict                 
#                    b'678':bytearray(b'9AB')}:
# for v1, v2, v3 in {b'012':bytearray(b'345'),         # dict.keys()
#                    b'678':bytearray(b'9AB')}.keys():
    print(v1, v2, v3)
# 48 49 50
# 54 55 56

for v1, v2, v3 in {b'012':b'345',                      # dict.values()
                   b'678':b'9AB'}.values():
# for v1, v2, v3 in {b'012':bytearray(b'345'),         # dict.values()
#                    b'678':bytearray(b'9AB')}.values():
    print(v1, v2, v3)
# 51 52 53
# 57 65 66

for v1, v2 in {b'012':b'345', b'678':b'9AB'}.items():  # dict.items()
    print(v1, v2)
# 012 345
# 678 9AB

for v1, v2 in {b'012':bytearray(b'345'),               # dict.items()
               b'678':bytearray(b'9AB')}.items():
    print(v1, v2)
# b'012' bytearray(b'345')
# b'678' bytearray(b'9AB')

for v1, *v2, v3 in ['012345', '6789AB']:              # list(str)
    print(v1, v2, v3)
    print(v1, *v2, v3)
# 0 ['1', '2', '3', '4'] 5
# 0 1 2 3 4 5
# 6 ['7', '8', '9', 'A'] B
# 6 7 8 9 a b

for v1, *v2 in [*'012345', *'6789AB']:                # list(*str)
    print(v1, v2)
    print(v1, *v2)
# 0 []
# 0 Nothing
# 1 []
# 1 Nothing
# 2 []
# 2 Nothing
# 3 []
# 3 Nothing
# 4 []
# 4 Nothing
# 5 []
# 5 Nothing
# 6 []
# 6 Nothing
# 7 []
# 7 Nothing
# 8 []
# 8 Nothing
# 9 []
# 9 Nothing
# A []
# A Nothing
# B []
# B Nothing

for v1, *v2, v3 in [b'012345', b'6789AB']:            # list(bytes)
# for v1, *v2, v3 in [bytearray(b'012345'),           # list(bytearray)
#                     bytearray(b'6789AB')]:
    print(v1, v2, v3)
    print(v1, *v2, v3)
# 48 [49, 50, 51, 52] 53
# 48 49 50 51 52 53
# 54 [55, 56, 57, 65] 66
# 54 55 56 57 65 66

for *v1, v2, v3 in [[0, 1, 2, 3, 4, 5],
                    [6, 7, 8, 9, 10, 11]]:
    print(v1, v2, v3)
    print(*v1, v2, v3)
# [0, 1, 2, 3] 4 5
# 0 1 2 3 4 5
# [6, 7, 8, 9] 10 11
# 6 7 8 9 10 11

for v1, v2, *v3 in [[0, 1, 2, 3, 4, 5],
                    [6, 7, 8, 9, 10, 11]]:
    print(v1, v2, v3)
    print(v1, v2, *v3)
# 0 1 [2, 3, 4, 5]
# 0 1 2 3 4 5
# 6 7 [8, 9, 10, 11]
# 6 7 8 9 10 11

for v1, *v2, v3 in [[0, 1],
                    [2, 3]]:
    print(v1, v2, v3)
    print(v1, *v2, v3)
# 0 [] 1
# 0 Nothing 1
# 2 [] 3
# 2 Nothing 3

for *v1, v2, v3 in [[0, 1],
                    [2, 3]]:
    print(v1, v2, v3)
    print(*v1, v2, v3)
# [] 0 1
# Nothing 0 1
# [] 2 3
# Nothing 2 3

for v1, v2, *v3 in [[0, 1],
                    [2, 3]]:
    print(v1, v2, v3)
    print(v1, v2, *v3)
# 0 1 []
# 0 1 Nothing
# 2 3 []
# 2 3 Nothing

for v1, *v2, v3 in [[0, 1, 2, 3, 4, 5],
                    [6, 7, 8, 9, 10, 11]]:
# for (v1, *v2, v3) in [[0, 1, 2, 3, 4, 5],
#                       [6, 7, 8, 9, 10, 11]]:
# for [v1, *v2, v3] in [[0, 1, 2, 3, 4, 5],
#                       [6, 7, 8, 9, 10, 11]]:
    print(v1, v2, v3)
    print(v1, *v2, v3)
# 0 [1, 2, 3, 4] 5
# 0 1 2 3 4 5
# 6 [7, 8, 9, 10] 11
# 6 7 8 9 10 11

for v1, *v2, v3 in [[[0, 1], 2, [3, 4, [5]]],
                    [[6, 7], 8, [9, 10, [11]]]]:
# for (v1, *v2, v3) in [[[0, 1], 2, [3, 4, [5]]],
#                       [[6, 7], 8, [9, 10, [11]]]]:
# for [v1, *v2, v3] in [[[0, 1], 2, [3, 4, [5]]],
#                       [[6, 7], 8, [9, 10, [11]]]]:
    print(v1, v2, v3)
    x1, x2, x3 = v3
    print(*v1, *v2, x1, x2, *x3)
# [0, 1] [2] [3, 4, [5]]
# 0 1 2 3 4 5
# [6, 7] [8] [9, 10, [11]]
# 6 7 8 9 10 11

for (*v1, v2), *v3, (v4, *v5, (*v6,)) in [[[0, 1], 2, [3, 4, [5]]],
                                          [[6, 7], 8, [9, 10, [11]]]]:
# for ((*v1, v2), *v3, (v4, *v5, (*v6,))) in [[[0, 1], 2, [3, 4, [5]]],
#                                             [[6, 7], 8, [9, 10, [11]]]]:
# for [[*v1, v2], *v3, [v4, *v5, [*v6]]] in [[[0, 1], 2, [3, 4, [5]]],
#                                            [[6, 7], 8, [9, 10, [11]]]]:
    print(v1, v2, v3, v4, v5, v6)
    print(*v1, v2, *v3, v4, *v5, *v6)
# [0] 1 [2] 3 [4] [5]
# 0 1 2 3 4 5
# [6] 7 [8] 9 [10] [11]
# 6 7 8 9 10 11

for (*(v1,), v2), *(v3,), (v4, *(v5,), (*(v6,),)) in [[[0, 1], 2,
                                                       [3, 4, [5]]],
                                                      [[6, 7], 8,
                                                       [9, 10, [11]]]]:
# for ((*(v1,), v2), *(v3,), (v4, *(v5,), (*(v6,),))) in [[[0, 1], 2,
#                                                          [3, 4, [5]]],
#                                                         [[6, 7], 8,
#                                                          [9, 10, [11]]]]:
# for [[*[v1], v2], *[v3], [v4, *[v5], [*[v6]]]] in [[[0, 1], 2,
#                                                     [3, 4, [5]]],
#                                                    [[6, 7], 8,
#                                                     [9, 10, [11]]]]:
    print(v1, v2, v3, v4, v5, v6)
# 0 1 2 3 4 5
# 6 7 8 9 10 11

for *v, in [[0],
            [1]]:
# for (*v,) in [[0],
#               [1]]:
# for [*v] in [[0],
#              [1]]:
    print(v)
    print(*v)
# [0]
# 0
# [1]
# 1

for *(v,), in [[0],
               [1]]:
# for (*(v,),) in [[0],
#                  [1]]:
# for [*[v]] in [[0],
#                [1]]:
    print(v)
# 0
# 1

for v1, *v2, v3 in [[0],
                    [1]]:
# for *v1, v2, v3 in [[0],
#                     [1]]:
# for v1, v2, *v3 in [[0],
#                     [1]]:
    pass
# ValueError: not enough values to unpack (expected at least 2, got 1)

for *v in [[0, 1, 2, 3, 4, 5],
           [6, 7, 8, 9, 10, 11]]:
    pass
# SyntaxError: starred assignment target must be in a list or tuple

for *v1, *v2, v3 in [[0, 1, 2, 3, 4, 5],
                     [6, 7, 8, 9, 10, 11]]:
    pass
# SyntaxError: multiple starred expressions in assignment

for v1, v2, v3 in *[[0, 1, 2, 3, 4, 5],               # *list(list)
                    [6, 7, 8, 9, 10, 11]]:
# for v1, v2, v3 in *((0, 1, 2, 3, 4, 5),             # *tuple(tuple)
#                     (6, 7, 8, 9, 10, 11)):
# for v1, *v2, v3 in *{frozenset({0, 1, 2, 3, 4, 5}), # *set(frozenset)
#                      frozenset({6, 7, 8, 9, 10, 11})}:
# *frozenset(frozenset)
# for v1, *v2, v3 in *frozenset({frozenset({0, 1, 2, 3, 4, 5}),
#                                frozenset({6, 7, 8, 9, 10, 11})}):
# for v1, *v2, v3 in *iter([iter([0, 1, 2, 3, 4, 5]), # *iterator(iterator)
#                           iter([6, 7, 8, 9, 10, 11])]):
    pass
# SyntaxError: can't use starred expression here

for v1, v2, v3 in [*[0, 1, 2, 3, 4, 5],               # list(*list)
                   *[6, 7, 8, 9, 10, 11]]:
# for v1, v2, v3 in (*(0, 1, 2, 3, 4, 5),             # tuple(*tuple)
#                    *(6, 7, 8, 9, 10, 11)):
# for v1, *v2, v3 in {*frozenset({0, 1, 2, 3, 4, 5}), # set(*frozenset)
#                     *frozenset({6, 7, 8, 9, 10, 11})}:
# frozenset(*frozenset)
# for v1, *v2, v3 in frozenset({*frozenset({0, 1, 2, 3, 4, 5}),
#                               *frozenset({6, 7, 8, 9, 10, 11})}):
# for v1, *v2, v3 in iter([*iter([0, 1, 2, 3, 4, 5]), # iterator(*iterator)
#                          *iter([6, 7, 8, 9, 10, 11])]):
    pass
# TypeError: cannot unpack non-iterable int object

for v1, *v2, v3 in [**{0:1, 2:3, 4:5, 6:7, 8:9, 10:11}, 
                    **{12:13, 14:15, 16:17, 18:19, 20:21, 22:23}]:
    pass
# SyntaxError: invalid syntax
Enter fullscreen mode Exit fullscreen mode

Top comments (0)