DEV Community

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

Posted on

Unpacking in Python (2)

Buy Me a Coffee

*Memo:

  • My post explains the unpacking with an assignment statement (1).
  • My post explains the unpacking with a for statement (1).
  • My post explains the unpacking with a for 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 an assignment statement as shown below:

v1, *v2, v3 = [0, 1, 2, 3, 4, 5]                        # list
# list(list(list))
v1, *v2, v3 = [*[0, 1], 2, *[3, 4, *[5]]]
v1, *v2, v3 = (0, 1, 2, 3, 4, 5)                        # tuple
# tuple(tuple(tuple))
v1, *v2, v3 = (*(0, 1), 2, *(3, 4, *(5,)))
v1, *v2, v3 = {0, 1, 2, 3, 4, 5}                        # set
# set(set(set))
v1, *v2, v3 = {*{0, 1}, 2, *{3, 4, *{5,}}}
v1, *v2, v3 = frozenset({0, 1, 2, 3, 4, 5})             # frozenset
v1, *v2, v3 = iter([0, 1, 2, 3, 4, 5])                  # iterator
v1, *v2, v3 = range(6)                                  # range

print(v1, v2, v3)  # 0 [1, 2, 3, 4] 5
print(v1, *v2, v3) # 0 1 2 3 4 5

v1, *v2, v3 = {0:1, 2:3, 4:5, 6:7, 8:9, 10:11}          # dict
# dict(dict(dict))
v1, *v2, v3 = {**{0:1, 2:3}, 4:5, **{6:7, 8:9, **{10:11}}}
v1, *v2, v3 = {0:1, 2:3, 4:5, 6:7, 8:9, 10:11}.keys()   # dict.keys()

print(v1, v2, v3)  # 0 [2, 4, 6, 8] 10
print(v1, *v2, v3) # 0 2 4 6 8 10

v1, *v2, v3 = {0:1, 2:3, 4:5, 6:7, 8:9, 10:11}.values() # dict.values()

print(v1, v2, v3)  # 1 [3, 5, 7, 9] 11
print(v1, *v2, v3) # 1 3 5 7 9 11

v1, *v2, v3 = {0:1, 2:3, 4:5, 6:7, 8:9, 10:11}.items()  # dict.items()

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

v1, *v2, v3 = '012345'                                  # str

print(v1, v2, v3)  # 0 ['1', '2', '3', '4'] 5
print(v1, *v2, v3) # 0 1 2 3 4 5

v1, *v2, v3 = b'012345'                                 # bytes
v1, *v2, v3 = bytearray(b'012345')                      # bytearray

print(v1, v2, v3)  # 48 [49, 50, 51, 52] 53
print(v1, *v2, v3) # 48 49 50 51 52 53

*v1, v2, v3 = [0, 1, 2, 3, 4, 5]

print(v1, v2, v3)  # [0, 1, 2, 3] 4 5
print(*v1, v2, v3) # 0 1 2 3 4 5

v1, v2, *v3 = [0, 1, 2, 3, 4, 5]

print(v1, v2, v3)  # 0 1 [2, 3, 4, 5]
print(v1, v2, *v3) # 0 1 2 3 4 5

v1, *v2, v3 = [0, 1]

print(v1, v2, v3)  # 0 [] 1
print(v1, *v2, v3) # 0 Nothing 1

*v1, v2, v3 = [0, 1]

print(v1, v2, v3)  # [] 0 1
print(*v1, v2, v3) # Nothing 0 1

v1, v2, *v3 = [0, 1]

print(v1, v2, v3)  # 0 1 []
print(v1, v2, *v3) # 0 1 Nothing

v1, *v2, v3 = [0, 1, 2, 3, 4, 5]
(v1, *v2, v3) = [0, 1, 2, 3, 4, 5]
[v1, *v2, v3] = [0, 1, 2, 3, 4, 5]

print(v1, v2, v3)  # 0 [1, 2, 3, 4] 5 
print(v1, *v2, v3) # 0 1 2 3 4 5

v1, *v2, v3 = [[0, 1], 2, [3, 4, [5]]]
(v1, *v2, v3) = [[0, 1], 2, [3, 4, [5]]]
[v1, *v2, v3] = [[0, 1], 2, [3, 4, [5]]]

print(v1, v2, v3)            # [0, 1] [2] [3, 4, [5]]
w1, w2, w3 = v3
print(*v1, *v2, w1, w2, *w3) # 0 1 2 3 4 5

(*v1, v2), *v3, (v4, *v5, (*v6,)) = [[0, 1], 2, [3, 4, [5]]]
((*v1, v2), *v3, (v4, *v5, (*v6,))) = [[0, 1], 2, [3, 4, [5]]]
[[*v1, v2], *v3, [v4, *v5, [*v6]]] = [[0, 1], 2, [3, 4, [5]]]

print(v1, v2, v3, v4, v5, v6)     # [0] 1 [2] 3 [4] [5]
print(*v1, v2, *v3, v4, *v5, *v6) # 0 1 2 3 4

(v1, v2), *(v2,), (v3, *(v4,), (*(v5,),)) = [[0, 1], 2, [3, 4, [5]]]
((v1, v2), *(v3,), (v4, *(v5,), (*(v6,),))) = [[0, 1], 2, [3, 4, [5]]]
[v1, v2], *[v3], [v4, *[v5], [*[v6]]] = [[0, 1], 2, [3, 4, [5]]]

print(v1, v2, v3, v4, v5)
# 0 1 2 3 4

*v, = [0]
(*v,) = [0]
[*v] = [0]

print(v)  # [0]
print(*v) # 0

*(v,), = [0]
(*(v,),) = [0]
[*[v]] = [0]

print(v)
# 0

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

*v1, *v2, v3 = [0, 1, 2, 3, 4, 5]
# SyntaxError: multiple starred expressions in assignment

*v = [0, 1, 2, 3, 4, 5]
# SyntaxError: starred assignment target must be in a list or tuple

v1, v2, v3 = *[0, 1, 2, 3, 4, 5]                # list
v1, v2, v3 = *(0, 1, 2, 3, 4, 5)                # tuple
v1, v2, v3 = *{0, 1, 2, 3, 4, 5}                # set
v1, v2, v3 = *frozenset({0, 1, 2, 3, 4, 5})     # frozenset
v1, v2, v3 = *{0:1, 2:3, 4:5, 6:7, 8:9, 10:11}  # dict
v1, v2, v3 = *iter([0, 1, 2, 3, 4, 5])          # iterator
v1, v2, v3 = *'012345'                          # str
v1, v2, v3 = *b'012345'                         # bytes
v1, v2, v3 = *bytearray(b'012345')              # bytearray
v1, v2, v3 = *range(6)                          # range
# SyntaxError: can't use starred expression here

v1, v2, v3 = **{0:1, 2:3, 4:5, 6:7, 8:9, 10:11} # dict
# SyntaxError: invalid syntax
Enter fullscreen mode Exit fullscreen mode

Top comments (0)