Décompresser (développer et affecter à plusieurs variables) des tuples et des listes en Python

Affaires

En Python, les éléments d'un tuple ou d'une liste peuvent être décomposés et affectés à plusieurs variables. Ceci est appelé déballage de séquence ou affectation déballée.

Les détails suivants sont décrits ici.

  • Déballage des éléments de base des tuples et des listes
  • Tuples imbriqués, listes déballées
  • Déballage avec les tirets bas:_
  • Déballage avec astérisques:*

Consultez l'article suivant pour obtenir des informations sur l'utilisation des astérisques pour développer et transmettre des tuples, des listes et des dictionnaires comme arguments de fonction.

Déballage des éléments de base des tuples et des listes

Lorsque les variables sont écrites à gauche, séparées par des virgules, chaque variable se voit attribuer un élément du tuple ou de la liste à droite. Il en va de même pour les tuples et les listes (les exemples suivants sont écrits sous forme de tuples).

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

Notez que puisque les tuples peuvent omettre les parenthèses rondes, ceci peut être utilisé pour assigner plusieurs valeurs à plusieurs variables sur une seule ligne comme suit.

a, b = 0, 1

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

Si le nombre de variables ne correspond pas au nombre d'éléments, une erreur se produit.

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

Si le nombre de variables est inférieur au nombre d'éléments, les éléments restants peuvent être affectés sous forme de liste en ajoutant un astérisque au nom de la variable (voir ci-dessous).

Tuples imbriqués, listes déballées

Les tuples et les listes imbriqués peuvent également être décompressés. Si vous souhaitez également décompresser le contenu, enfermez la variable dans l'un des éléments suivants

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

Déballé avec _underscore_.

En Python, non seulement les valeurs non emballées, mais aussi celles qui ne sont pas nécessaires sont conventionnellement assignées au trait de soulignement (underscore) _. Il n'y a pas de signification grammaticale particulière ; elles sont simplement assignées à une variable nommée _.

t = (0, 1, 2)

a, b, _ = t

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

Déballage avec astérisques

Si le nombre de variables est inférieur au nombre d'éléments, un astérisque dans le nom de la variable fera en sorte que les éléments seront assignés ensemble comme une liste.

Cette syntaxe a été implémentée depuis Python 3 et n'est pas disponible dans Python 2.

Les éléments sont affectés du début et de la fin aux variables sans astérisque, et les éléments restants sont affectés sous forme de liste aux variables avec astérisque.

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

Par exemple, si vous souhaitez affecter uniquement les deux premiers éléments d'un tuple ou d'une liste à une variable, vous pouvez utiliser le trait de soulignement ci-dessus pour les parties qui ne sont pas nécessaires.

a, b, *_ = t

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

On peut aussi l'écrire comme suit

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

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

Un seul astérisque peut être attaché. Si plusieurs variables sont marquées d'un astérisque, une erreur SyntaxError sera générée car il n'est pas possible de déterminer le nombre d'éléments affectés à chaque variable.

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

Notez que même un seul élément assigné à une variable marquée d'un astérisque est assigné comme une liste.

t = (0, 1, 2)

a, b, *c = t

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

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

S'il n'y a pas d'éléments supplémentaires, une liste vide est attribuée.

a, b, c, *d = t

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