Despachetarea (extinderea și atribuirea la mai multe variabile) tuplurilor și listelor în Python

Afaceri

În Python, elementele unui tuple sau ale unei liste pot fi extinse și atribuite la mai multe variabile. Acest lucru se numește despachetare de secvențe sau atribuire despachetată.

Aici sunt descrise următoarele detalii.

  • Noțiuni de bază privind despachetarea tulelor și a listelor
  • Tupluri imbricate, listări neambalate
  • Despachetarea cu sublinieri:_
  • Despachetarea cu asteriscuri:*

Consultați următorul articol pentru informații privind utilizarea asteriscurilor pentru a extinde și a transmite tupluri, liste și dicționare ca argumente ale funcțiilor.

Noțiuni de bază privind despachetarea tulelor și a listelor

Atunci când variabilele sunt scrise în partea stângă, separate prin virgule, fiecărei variabile i se atribuie un element din tuple sau din lista din partea dreaptă. Acest lucru este valabil atât pentru tuple cât și pentru liste (exemplele următoare sunt scrise sub formă de tuplu).

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

Rețineți că, deoarece tuplurile pot omite parantezele rotunde, acest lucru poate fi utilizat pentru a atribui mai multe valori la mai multe variabile pe o singură linie, după cum urmează.

a, b = 0, 1

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

În cazul în care numărul de variabile nu corespunde numărului de elemente, se produce o eroare.

# 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)

În cazul în care numărul de variabile este mai mic decât numărul de elemente, elementele rămase pot fi atribuite sub forma unei liste prin adăugarea unui asterisc la numele variabilei (a se vedea mai jos).

Tupluri imbricate, listări neambalate

De asemenea, tuplurile și listele imbricate pot fi despachetate. Dacă doriți să despachetați și conținutul, includeți variabila într-unul din următoarele moduri

  • ()
  • []
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

Despachetat cu _underscore_.

În Python, nu numai neambalate, valorile care nu sunt necesare sunt atribuite în mod convențional la semnul de subliniere (underscore) _. Nu există o semnificație gramaticală specială; ele sunt pur și simplu atribuite unei variabile numite _.

t = (0, 1, 2)

a, b, _ = t

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

Despachetarea cu asteriscuri

În cazul în care numărul de variabile este mai mic decât numărul de elemente, un asterisc în numele variabilei va face ca elementele să fie atribuite împreună sub forma unei liste.

Această sintaxă a fost implementată începând cu Python 3 și nu este disponibilă în Python 2.

Elementele sunt atribuite de la început și de la sfârșit variabilelor fără asteriscuri, iar elementele rămase sunt atribuite sub formă de listă variabilelor cu asteriscuri.

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

De exemplu, dacă doriți să atribuiți doar primele două elemente ale unui tuple sau ale unei liste la o variabilă, puteți utiliza sublinierea de mai sus pentru părțile care nu sunt necesare.

a, b, *_ = t

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

Același lucru poate fi scris, de asemenea, după cum urmează

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

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

Se poate atașa doar un singur asterisc. În cazul în care există mai multe variabile marcate cu un asterisc, se va produce o eroare SyntaxError, deoarece nu se poate determina câte elemente sunt atribuite fiecărei variabile.

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

Rețineți că până și un singur element atribuit unei variabile marcate cu un asterisc este atribuit ca o listă.

t = (0, 1, 2)

a, b, *c = t

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

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

În cazul în care nu există elemente suplimentare, se atribuie o listă goală.

a, b, c, *d = t

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