Розпакуйте (розгорніть і призначте кільком змінним) кортежі та списки в Python

Бізнес

У Python елементи кортежу або списку можна розширити та призначити кільком змінним. Це називається розпакуванням послідовності або розпакованим призначенням.

Тут описано наступні деталі.

  • Розпакування основ кортежів і списків
  • Вкладені кортежи, розпаковані списки
  • Розпакування за допомогою символів підкреслення:_
  • Розпакування із зірочками:*

Перегляньте наступну статтю, щоб отримати інформацію про використання зірочок для розширення та передачі кортежів, списків і словників як аргументів функції.

Розпакування основ кортежів і списків

Коли змінні записуються в лівій частині, розділяючись комами, кожній змінній призначається елемент кортежу або списку з правого боку. Це однаково як для кортежів, так і для списків (наведені нижче приклади записані у формі кортежів).

t = (0, 1, 2)

a, b, c = t

print(a)
print(b)
print(c)
# 0
# 1
# 2

l = [0, 1, 2]

a, b, c = l

print(a)
print(b)
print(c)
# 0
# 1
# 2

Зауважте, що оскільки в кортежах можна опускати круглі дужки, це можна використовувати для призначення кількох значень кільком змінним в одному рядку, як показано нижче.

a, b = 0, 1

print(a)
print(b)
# 0
# 1

Якщо кількість змінних не відповідає кількості елементів, виникає помилка.

# a, b = t
# ValueError: too many values to unpack (expected 2)

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

Якщо кількість змінних менша за кількість елементів, інші елементи можна призначити у вигляді списку, додавши зірочку до імені змінної (див. нижче).

Вкладені кортежи, розпаковані списки

Вкладені кортежи та списки також можна розпакувати. Якщо ви також хочете розпакувати вміст, додайте змінну до одного з наступних

  • ()
  • []
t = (0, 1, (2, 3, 4))

a, b, c = t

print(a)
print(b)
print(c)
# 0
# 1
# (2, 3, 4)

print(type(c))
# <class 'tuple'>

a, b, (c, d, e) = t

print(a)
print(b)
print(c)
print(d)
print(e)
# 0
# 1
# 2
# 3
# 4

Розпаковано за допомогою _підчеркивання_.

У Python, не тільки розпаковані, значення, які не потрібні, умовно призначаються символу підкреслення (підкреслення) _. Особливого граматичного значення немає; вони просто присвоюються змінній з іменем _.

t = (0, 1, 2)

a, b, _ = t

print(a)
print(b)
print(_)
# 0
# 1
# 2

Розпакування із зірочками

Якщо кількість змінних менша за кількість елементів, зірочка в назві змінної призведе до того, що елементи будуть призначені разом у вигляді списку.

Цей синтаксис реалізовано з Python 3 і недоступний у Python 2.

Елементи призначаються від початку і кінця змінним без зірочок, а інші елементи призначаються у вигляді списку змінним із зірочками.

t = (0, 1, 2, 3, 4)

a, b, *c = t

print(a)
print(b)
print(c)
# 0
# 1
# [2, 3, 4]

print(type(c))
# <class 'list'>

a, *b, c = t

print(a)
print(b)
print(c)
# 0
# [1, 2, 3]
# 4

*a, b, c = t

print(a)
print(b)
print(c)
# [0, 1, 2]
# 3
# 4

Наприклад, якщо ви хочете призначити змінній лише перші два елементи кортежу або списку, ви можете використовувати наведене вище підкреслення для частин, які не потрібні.

a, b, *_ = t

print(a)
print(b)
print(_)
# 0
# 1
# [2, 3, 4]

Те ж саме можна записати так

a, b = t[0], t[1]

print(a)
print(b)
# 0
# 1

Можна прикріпити лише одну зірочку. Якщо є кілька змінних, позначених зірочкою, виникне помилка SyntaxError, оскільки неможливо визначити, скільки елементів призначено кожній змінній.

# *a, b, *c = t
# SyntaxError: two starred expressions in assignment

Зверніть увагу, що навіть один елемент, призначений змінній, позначеній зірочкою, призначається як список.

t = (0, 1, 2)

a, b, *c = t

print(a)
print(b)
print(c)
# 0
# 1
# [2]

print(type(c))
# <class 'list'>

Якщо зайвих елементів немає, призначається порожній список.

a, b, c, *d = t

print(a)
print(b)
print(c)
print(d)
# 0
# 1
# 2
# []