Разопаковане (разширяване и присвояване на множество променливи) на кортежи и списъци в 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

Разопакован с _underscore_.

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