Tupels en lijsten in Python uitpakken (uitbreiden en toewijzen aan meerdere variabelen)

Bedrijf

In Python kunnen elementen van een tupel of lijst worden uitgebreid en toegewezen aan meerdere variabelen. Dit wordt sequence unpacking of unpacked assignment genoemd.

De volgende details worden hier beschreven.

  • Basisprincipes van tuples en lijsten uitpakken
  • Geneste tupels, uitgepakte lijsten
  • Uitpakken met Underscores:_
  • Uitpakken met sterretjes:*

Zie het volgende artikel voor informatie over het gebruik van asterisken om tupels, lijsten en woordenboeken uit te breiden en door te geven als functieargumenten.

Basisprincipes van tuples en lijsten uitpakken

Wanneer variabelen aan de linkerkant worden geschreven, gescheiden door komma's, krijgt elke variabele een element van de tupel of lijst aan de rechterkant. Dit is hetzelfde voor zowel tupels als lijsten (de volgende voorbeelden zijn in tuple-vorm geschreven).

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

Merk op dat, aangezien tuples ronde haakjes kunnen weglaten, dit gebruikt kan worden om meerdere waarden toe te kennen aan meerdere variabelen op één enkele lijn, als volgt.

a, b = 0, 1

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

Als het aantal variabelen niet overeenkomt met het aantal elementen, treedt een fout op.

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

Indien het aantal variabelen kleiner is dan het aantal elementen, kunnen de overblijvende elementen als een lijst worden toegekend door een sterretje toe te voegen aan de variabelenaam (zie hieronder).

Geneste tupels, uitgepakte lijsten

Geneste tupels en lijsten kunnen ook worden uitgepakt. Als je de inhoud ook wilt uitpakken, sluit je de variabele in met een van de volgende

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

Uitgepakt met _underscore_.

In Python, niet alleen uitgepakt, worden waarden die niet nodig zijn conventioneel toegewezen aan de underscore (onderstrepingsteken) _. Er is geen speciale grammaticale betekenis; ze worden gewoon toegewezen aan een variabele met de naam _.

t = (0, 1, 2)

a, b, _ = t

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

Uitpakken met sterretjes

Indien het aantal variabelen kleiner is dan het aantal elementen, zal een sterretje in de variabelenaam ervoor zorgen dat de elementen samen als een lijst worden toegewezen.

Deze syntaxis is geïmplementeerd sinds Python 3 en is niet beschikbaar in Python 2.

De elementen worden vanaf het begin en het einde toegewezen aan de variabelen zonder sterretjes, en de resterende elementen worden als een lijst toegewezen aan de variabelen met sterretjes.

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

Als u bijvoorbeeld alleen de eerste twee elementen van een tupel of lijst aan een variabele wilt toewijzen, zou u de bovenstaande underscore kunnen gebruiken voor de delen die niet nodig zijn.

a, b, *_ = t

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

Hetzelfde kan ook als volgt worden geschreven

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

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

Er kan slechts één sterretje worden geplaatst. Als er meerdere variabelen met een sterretje zijn gemarkeerd, zal er een SyntaxError-fout optreden omdat niet kan worden bepaald hoeveel elementen aan elke variabele zijn toegewezen.

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

Merk op dat zelfs een enkel element toegewezen aan een variabele gemarkeerd met een asterisk, wordt toegewezen als een lijst.

t = (0, 1, 2)

a, b, *c = t

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

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

Als er geen extra elementen zijn, wordt een lege lijst toegewezen.

a, b, c, *d = t

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