Распаковка (расширение и присвоение нескольким переменным) кортежей и списков в 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 не только распакованные, но и ненужные значения условно присваиваются через знак подчеркивания (underscore) _. Никакого специального грамматического значения нет; они просто присваиваются переменной с именем _.

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
# []
Copied title and URL