Skip to content

Décompresser un tuple et une liste en Python

En Python, vous pouvez affecter des éléments d’un tuple ou d’une liste à plusieurs variables. C’est ce qu’on appelle le déballage de séquence.

Cet article décrit le contenu suivant.

  • Principes de base du déballage d’un tuple et d’une liste
  • Décompresser un tuple et une liste imbriqués
  • Décompresser avec _ (trait de soulignement)
  • Déballer avec * (astérisque)

Consultez l’article suivant pour le cas de la décompression de tuples, de listes et de dictionnaires (dict) en tant qu’arguments avec * (astérisque).

Principes de base du déballage d’un tuple et d’une liste

Si vous écrivez des variables sur le côté gauche séparées par des virgules ,, les éléments d’un tuple ou d’une liste sur le côté droit sont affectés à chaque variable. Les exemples suivants utilisent des tuples, mais il en va de même pour les listes.

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

Étant donné que les parenthèses des tuples peuvent être omises, plusieurs valeurs peuvent être attribuées à plusieurs variables sur une seule ligne comme suit.

a, b = 0, 1

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

Une erreur est levée si le nombre de variables ne correspond pas au nombre d’éléments.

# 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, il est possible d’ajouter un astérisque * au nom de la variable et d’affecter les éléments restants sous forme de liste. Ceci est décrit plus tard.

Décompresser un tuple et une liste imbriqués

Vous pouvez également décompresser un tuple ou une liste imbriqués. Si vous souhaitez développer l’élément interne, entourez la variable de () ou [].

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écompresser avec _ (trait de soulignement)

Par convention, des valeurs inutiles peuvent être attribuées aux traits de soulignement _ en Python. Il n’a pas de signification grammaticale particulière mais est simplement affecté à une variable nommée _.

t = (0, 1, 2)

a, b, _ = t

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

Déballer avec * (astérisque)

Si le nombre de variables est inférieur au nombre d’éléments, l’ajout d’un astérisque * au nom de la variable affectera les éléments ensemble sous forme de liste.

Il est implémenté dans Python 3 et ne peut pas être utilisé dans Python 2.

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

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, lorsque l’on souhaite affecter uniquement les deux premiers éléments d’un tuple ou d’une liste à des variables, le trait de soulignement _ peut être utilisé pour les parties inutiles.

a, b, *_ = t

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

Le même processus peut s’écrire comme suit :

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

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

Vous ne pouvez ajouter * qu’à une seule variable.

S’il y a plusieurs variables avec *, il est impossible de déterminer combien d’éléments doivent être affectés, donc SyntaxError est déclenché.

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

Notez que même si un seul élément est affecté à une variable avec *, il est affecté en tant que 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
# []