DEV Community

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

Posted on

Unpacking in Python (5)

Buy Me a Coffee

*Memo:

  • My post explains the unpacking with a for statement (1).
  • My post explains the unpacking with a for statement (2).
  • 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 iterable unpacking with * and a function (3).
  • My post explains the dictionary unpacking with ** and a function.
  • My post explains *args.
  • My post explains **kwargs.

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],
                    [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 *v1, *v2, v3 in [[0, 1, 2, 3, 4, 5],
                     [6, 7, 8, 9, 10, 11]]:
    pass
# SyntaxError: multiple starred expressions in assignment

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

# list(*list)
for v1, *v2, v3 in [*[0, 1, 2, 3, 4, 5], *[6, 7, 8, 9, 10, 11]]: pass
# tuple(*tuple)
for v1, *v2, v3 in (*(0, 1, 2, 3, 4, 5), *(6, 7, 8, 9, 10, 11)): pass
# set(*frozenset)
for v1, *v2, v3 in {*frozenset({0, 1, 2, 3, 4, 5}),
                    *frozenset({6, 7, 8, 9, 10, 11})}: pass
# frozenset(*frozenset)
for v1, *v2, v3 in frozenset({*frozenset({0, 1, 2, 3, 4, 5}),
                              *frozenset({6, 7, 8, 9, 10, 11})}): pass
# list(*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}]: pass
# 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()]: pass
# 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()]:
    pass
# iterator(*iterator)
for v1, *v2, v3 in iter([*iter([0, 1, 2, 3, 4, 5]),
                         *iter([6, 7, 8, 9, 10, 11])]): pass
# list(*bytes)
for v1, *v2, v3 in [*b'012345', *b'6789AB']: pass
# list(*bytearray)
for v1, *v2, v3 in [*bytearray(b'012345'), *bytearray(b'6789AB')]: pass
# list(*range)
for v1, *v2, v3 in [*range(6), *range(6, 12)]: pass
# TypeError: cannot unpack non-iterable int object

for v1, *v2, v3 in *[[0, 1, 2, 3, 4, 5],                      # list
                     [6, 7, 8, 9, 10, 11]]: pass
for v1, *v2, v3 in *((0, 1, 2, 3, 4, 5),                      # tuple
                     (6, 7, 8, 9, 10, 11)): pass
for v1, *v2, v3 in *{frozenset({0, 1, 2, 3, 4, 5}),           # set
                     frozenset({6, 7, 8, 9, 10, 11})}: pass
for v1, *v2, v3 in *frozenset({frozenset({0, 1, 2, 3, 4, 5}), # frozenset
                               frozenset({6, 7, 8, 9, 10, 11})}): pass
for v1, *v2, v3 in *{'012345':'6789AB',                       # dict
                     'CDEFGH':'IJKLMN'}: pass
for v1, *v2, v3 in *{'012345':'6789AB',                       # dict.keys()
                     'CDEFGH':'IJKLMN'}.keys(): pass
for v1, *v2, v3 in *{'012345':'6789AB',                       # dict.values()
                     'CDEFGH':'IJKLMN'}.values(): pass
for v1, *v2, v3 in *{'012345':'6789AB',                       # dict.items()
                     'CDEFGH':'IJKLMN'}.items(): pass
for v1, *v2, v3 in *iter([iter([0, 1, 2, 3, 4, 5]),           # iterator
                          iter([6, 7, 8, 9, 10, 11])]): pass
for *v1, in *'012345': pass                                   # str
# SyntaxError: can't use starred expression here

for v1, *v2, v3 in [{'A':'B', *[0, 1, 2], 'C':'D'},            # list
                    {'E':'F', *[3, 4, 5], 'G':'H'}]: pass
for v1, *v2, v3 in [{'A':'B', *(0, 1, 2), 'C':'D'},            # tuple
                    {'E':'F', *(3, 4, 5), 'G':'H'}]: pass
for v1, *v2, v3 in [{'A':'B', *{0, 1, 2}, 'C':'D'},            # set
                    {'E':'F', *{3, 4, 5}, 'G':'H'}]: pass
for v1, *v2, v3 in [{'A':'B', *frozenset({0, 1, 2}), 'C':'D'}, # frozenset
                    {'E':'F', *frozenset([3, 4, 5]), 'G':'H'}]: pass
for v1, *v2, v3 in [{'A':'B', *{0:1, 2:3}, 'C':'D'},           # dict
                    {'E':'F', *{4:5, 6:7}, 'G':'H'}]: pass
for v1, *v2, v3 in [{'A':'B', *{0:1, 2:3}.keys(), 'C':'D'},    # dict.keys()
                    {'E':'F', *{4:5, 6:7}.keys(), 'G':'H'}]: pass
for v1, *v2, v3 in [{'A':'B', *{0:1, 2:3}.values() 'C':'D'},   # dict.values()
                    {'E':'F', *{4:5, 6:7}.values(), 'G':'H'}]: pass
for v1, *v2, v3 in [{'A':'B', *{0:1, 2:3}.items(), 'C':'D'},   # dict.items()
                    {'E':'F', *{4:5, 6:7}.items(), 'G':'H'}]: pass
for v1, *v2, v3 in [{'A':'B', *iter([0, 1, 2]), 'C':'D'},      # iterator
                    {'E':'F', *iter([3, 4, 5]), 'G':'H'}]: pass
for v1, *v2, v3 in [{'A':'B', *'012', 'C':'D'},                # str
                    {'E':'F', *'345', 'G':'H'}]: pass
for v1, *v2, v3 in [{'A':'B', *b'012', 'C':'D'},               # bytes
                    {'E':'F', *b'345', 'G':'H'}]: pass
for v1, *v2, v3 in [{'A':'B', *bytearray(b'012'), 'C':'D'},    # bytearray
                    {'E':'F', *bytearray(b'345'), 'G':'H'}]: pass
for v1, *v2, v3 in [{'A':'B', *range(3), 'C':'D'},             # range
                    {'E':'F', *range(3, 6), 'G':'H'}]: pass
# SyntaxError: invalid syntax

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

for v1, *v2, v3 in **[[0, 1, 2, 3, 4, 5],                      # list
                      [6, 7, 8, 9, 10, 11]]: pass
for v1, *v2, v3 in **((0, 1, 2, 3, 4, 5),                      # tuple
                      (6, 7, 8, 9, 10, 11)): pass
for v1, *v2, v3 in **{frozenset({0, 1, 2, 3, 4, 5}),           # set
                      frozenset({6, 7, 8, 9, 10, 11})}: pass
for v1, *v2, v3 in **frozenset({frozenset({0, 1, 2, 3, 4, 5}), # frozenset
                                frozenset({6, 7, 8, 9, 10, 11})}): pass
for v1, *v2, v3 in **{'012345':'6789AB',                       # dict
                      'CDEFGH':'IJKLMN'}: pass
for v1, *v2, v3 in **{'012345':'6789AB',                       # dict.keys()
                      'CDEFGH':'IJKLMN'}.keys(): pass
for v1, *v2, v3 in **{'012345':'6789AB',                       # dict.values()
                      'CDEFGH':'IJKLMN'}.values(): pass
for v1, *v2, v3 in **{'012345':'6789AB',                       # dict.items()
                      'CDEFGH':'IJKLMN'}.items(): pass
for v1, *v2, v3 in **iter([iter([0, 1, 2, 3, 4, 5]),           # iterator
                           iter([6, 7, 8, 9, 10, 11])]): pass
for *v1, in **'012345': pass                                   # str
# SyntaxError: invalid syntax
Enter fullscreen mode Exit fullscreen mode

Top comments (0)