Lijstbegrippen in Python

List Comprehensions Python



Lijstbegrippen worden vaak gebruikt in Python om instructies van één regel te schrijven die een nieuwe lijst of woordenboek maken door over een itereerbaar object te lussen. Dit artikel legt uit hoe je lijstbegrippen in Python kunt gebruiken, te beginnen met een basisuitleg over hoe for-loops werken in Python.

For Loop in Python

Een for loop-instructie in Python itereert opeenvolgend over leden van elk object, lijst, tekenreeks enz. In vergelijking met andere programmeertalen is de syntaxis veel schoner en vereist het niet handmatig definiëren van iteratiestappen en het starten van iteratie. Hoewel er manieren zijn om het gedrag hetzelfde te maken als andere programmeertalen (wordt niet behandeld in dit artikel). Je kunt ook enige controle uitoefenen over for-loops door statements als continue, break, pass etc. te gebruiken. Hieronder staat een eenvoudig voorbeeld van for-loop in Python:







voorxin bereik(10):
afdrukken(x)

De for-lus hierboven zal tien getallen afdrukken die beginnen bij 0 en eindigen op 9.



Lijstbegrippen

Lijstbegrip is niets anders dan een verkorte / beknopte manier om meerregelige for-lussen in een one-liner-statement te schrijven. Het onderstaande voorbeeld van lijstbegrip maakt een nieuwe lijst als [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] door alle waarden van x erin op te nemen.



nummers= [xvoorxin bereik(10)]
afdrukken (nummers)

Merk op dat het begrip van een lijst altijd een nieuwe lijst maakt en de originele iterables die in de uitdrukking worden gebruikt, niet wijzigt. Een typische uitdrukking voor het begrip van een lijst moet een for-clausule hebben en kan worden gevolgd door if en else voorwaardelijke statements. Zonder lijstbegrip te gebruiken, wordt het bovenstaande voorbeeld op de volgende manier geschreven:





nummers= []
voorxin bereik(10):
nummers.toevoegen(x)

afdrukken (nummers)

Prestaties en leesbaarheid

Lijstbegrippen zijn sneller dan for-loops. Tenzij u echter honderdduizenden items herhaalt, zult u geen grote prestatieverbeteringen opmerken. Hoewel lijstbegrip een beknopte manier biedt om for-loops te schrijven, kunnen complexe uitdrukkingen leiden tot een slechte leesbaarheid van code en meer breedsprakigheid. Het is belangrijk om code leesbaar te houden, tenzij het bereiken van maximale prestaties een absolute noodzaak is voor uw programma.

Voorbeeld: Syntaxis voor lijstbegrippen gebruiken met woordenboeken en sets

Een python-woordenboek is een verzameling elementen die zijn gedefinieerd in sleutel-waardeparen, terwijl een set een verzameling unieke waarden is waarbij duplicaten niet zijn toegestaan. Lijstbegrippen kunnen ook worden gebruikt met Python-woordenboeken en -sets. De syntaxis verschilt enigszins, in plaats van de uitdrukking in vierkante accolades te plaatsen, moet u nu accolades gebruiken. U krijgt ook een nieuw woordenboek / set-object in plaats van een nieuwe lijst.



gegevens= {'stad':'New York', 'naam':'John Doe'}

formatted_data= {k: v.titel() voortot,vingegevens.artikelen()}

afdrukken (formatted_data)

Het bovenstaande voorbeeld converteert tekenreekswaarden naar hoofdletters en creëert een nieuw woordenboek met de naam formatted_data, waarvan de uitvoer zal zijn: {'city': 'New York', 'name': 'John Doe'}. U kunt het woordenboek / de set in-place ook wijzigen door de bestaande woordenboekvariabele aan de linkerkant op te geven.

gegevens= {'stad':'New York', 'naam':'John Doe'}

gegevens= {k: v.titel() voortot,vingegevens.artikelen()}

afdrukken (gegevens)

Zonder woordenboekbegrippen te gebruiken, zou de code er als volgt uitzien:

gegevens= {'stad':'New York', 'naam':'John Doe'}

formatted_data= {}

voortot,vingegevens.artikelen():
formatted_data[tot] =v.titel()

afdrukken (formatted_data)

Aangezien er geen sleutel-waardeparen in sets zijn, kan een setbegrip op dezelfde manier worden gedefinieerd als een lijstbegrip. Het enige verschil is het gebruik van accolades.

Voorbeeld: Meerdere for-lussen in een lijstbegrip

Het hierboven genoemde voorbeeld van het begrip van de lijst is eenvoudig en gebruikt een enkele for-statement. Hieronder ziet u een voorbeeld waarin meerdere for-lussen en een voorwaardelijke if-instructie worden gebruikt.

bijvoeglijke naamwoorden= ['Schijf', 'Ean', 'Focus', 'Kunstzinnig']

dieren= ['Dingo', 'Hermelijn', 'De put', 'Bever']

codenamen= [x +''+ envoorxinbijvoeglijke naamwoordenvoorenindierenindienen.begint met(x[0])]

afdrukken (codenamen)

De code toont [‘Disco Dingo’, ‘Eoan Ermine’, ‘Focal Fossa’] als uitvoer. De twee for-lussen gaan over bijvoeglijke naamwoorden en dierenlijsten en hun leden worden samengevoegd met een spatie, alleen als de eerste letter van beide woorden hetzelfde is. Zonder lijstbegrippen te gebruiken, zou de code er als volgt uitzien:

bijvoeglijke naamwoorden= ['Schijf', 'Ean', 'Focus', 'Kunstzinnig']
dieren= ['Dingo', 'Hermelijn', 'De put', 'Bever']

codenamen= []

voorxinbijvoeglijke naamwoorden:
voorenindieren:
indienen.begint met(x[0]):
codenamen.toevoegen(x +''+ en)

afdrukken (codenamen)

Voorbeeld: Lijstbegrip met if-else-clausule

Het onderstaande voorbeeld toont het gebruik van if en else-statements in lijstbegrippen.

nummer_lijst= [1, 2, 3, 4]
andere_lijst= [5, 6, 7, 8]

resultaat= [Waar indien (x + y)%2 == 0 anders niet waar voorxinnummer_lijstvooreninandere_lijst]

afdrukken (resultaat)

Tijdens het doorlopen van twee lijsten controleert het bovenstaande lijstbegrip of de som van het paar elementen even is of niet. Als u de bovenstaande code uitvoert, ziet u [True, False, True, False, False, True, False, True, True, False, True, False, False, True, False, True] als uitvoer. Zonder lijstbegrip te gebruiken, zou de code er als volgt uitzien:

nummer_lijst= [1, 2, 3, 4]
andere_lijst= [5, 6, 7, 8]
resultaat= []

voorxinnummer_lijst:
vooreninandere_lijst:
indien (x + y)%2 == 0:
resultaat.toevoegen(Waar)
anders:
resultaat.toevoegen(niet waar)

afdrukken (resultaat)

Conclusie

Lijstbegrippen bieden een leuke manier om duidelijke en beknopte loop-instructies te schrijven. Ze kunnen echter snel complex en moeilijk te begrijpen worden als er meerdere lussen en voorwaardelijke instructies worden gebruikt. Uiteindelijk komt het neer op het comfortniveau van een programmeur, maar over het algemeen is het een goed idee om expliciete, leesbare en gemakkelijk te debuggen code te schrijven in plaats van overdreven steno te gebruiken.