Spacchettare (espandere e assegnare a variabili multiple) tuple e liste in Python

Attività commerciale

In Python, gli elementi di una tupla o lista possono essere espansi e assegnati a più variabili. Questo è chiamato spacchettamento di sequenza o assegnazione spacchettata.

I seguenti dettagli sono descritti qui.

  • Basi di spacchettamento di tuple e liste
  • Tuple annidate, elenchi spacchettati
  • Disimballaggio con i trattini:_
  • Disimballaggio con asterischi:*

Vedi il seguente articolo per informazioni sull'uso degli asterischi per espandere e passare tuple, liste e dizionari come argomenti di funzioni.

Basi di spacchettamento di tuple e liste

Quando le variabili sono scritte sul lato sinistro, separate da virgole, ad ogni variabile viene assegnato un elemento della tupla o della lista sul lato destro. È lo stesso sia per le tuple che per le liste (gli esempi seguenti sono scritti in forma di tupla).

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

Si noti che poiché le tuple possono omettere le parentesi tonde, questo può essere usato per assegnare valori multipli a variabili multiple su una singola linea come segue.

a, b = 0, 1

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

Se il numero di variabili non corrisponde al numero di elementi, si verifica un errore.

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

Se il numero di variabili è inferiore al numero di elementi, gli elementi rimanenti possono essere assegnati come lista aggiungendo un asterisco al nome della variabile (vedi sotto).

Tuple annidate, elenchi spacchettati

Anche le tuple e le liste annidate possono essere scompattate. Se volete decomprimere anche il contenuto, racchiudete la variabile in uno dei seguenti elementi

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

Disimballato con _underscore_.

In Python, non solo spacchettati, i valori che non sono necessari sono convenzionalmente assegnati al trattino basso (underscore) _. Non c'è un significato grammaticale speciale; sono semplicemente assegnati ad una variabile chiamata _.

t = (0, 1, 2)

a, b, _ = t

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

Disimballaggio con asterischi

Se il numero di variabili è inferiore al numero di elementi, un asterisco nel nome della variabile farà sì che gli elementi siano assegnati insieme come una lista.

Questa sintassi è stata implementata da Python 3 e non è disponibile in Python 2.

Gli elementi sono assegnati dall'inizio e dalla fine alle variabili senza asterischi, e gli elementi rimanenti sono assegnati come lista alle variabili con asterischi.

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

Per esempio, se volete assegnare solo i primi due elementi di una tupla o di una lista a una variabile, potreste usare l'underscore per le parti che non sono necessarie.

a, b, *_ = t

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

Lo stesso può anche essere scritto come segue

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

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

Può essere allegato un solo asterisco. Se ci sono più variabili marcate con un asterisco, risulterà un errore SyntaxError perché non è possibile determinare quanti elementi sono assegnati a ciascuna variabile.

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

Notate che anche un singolo elemento assegnato a una variabile contrassegnata da un asterisco è assegnato come lista.

t = (0, 1, 2)

a, b, *c = t

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

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

Se non ci sono elementi extra, viene assegnata una lista vuota.

a, b, c, *d = t

print(a)
print(b)
print(c)
print(d)
# 0
# 1
# 2
# []
Copied title and URL