indien anders in een lijst begrip

Ik heb een lijst l:

l = [22, 13, 45, 50, 98, 69, 43, 44, 1]

Voor getallen boven de 45 wil ik graag 1 toevoegen; en voor getallen kleiner dan dit, 5.

Ik heb het geprobeerd

[x+1 for x in l if x >= 45 else x+5]

Maar ik krijg een syntaxisfout. Hoe kan ik een if elsezoals deze in een lijst begrijpen?


Antwoord 1, autoriteit 100%

>>> l = [22, 13, 45, 50, 98, 69, 43, 44, 1]
>>> [x+1 if x >= 45 else x+5 for x in l]
[27, 18, 46, 51, 99, 70, 48, 49, 6]

Doe iets als <condition>, doe anders iets anders.


Antwoord 2, autoriteit 47%

De reden dat u deze foutmelding krijgt, heeft te maken met de manier waarop de lijst wordt begrepen.

Houd rekening met het volgende:

[ expression for item in list if conditional ]

Is gelijk aan:

for item in list:
    if conditional:
        expression

Waar de expressioneen iets andere indeling heeft (denk aan het wisselen van onderwerp en werkwoordvolgorde in een zin).

Daarom doet uw code [x+1 for x in l if x >= 45]dit:

for x in l:
    if x >= 45:
        x+1

Deze code [x+1 if x >= 45 else x+5 for x in l]doet echter dit (na het herschikken van de expression):

for x in l:
    if x>=45: x+1
    else: x+5

Antwoord 3, autoriteit 42%

[x+1 if x >= 45 else x+5 for x in l]

En voor een beloning, hier is de opmerking die ik schreef om dit te onthouden de eerste keer dat ik deze fout deed:

De voorwaardelijke expressie van Python is a if C else ben kan niet worden gebruikt als:

[a for i in items if C else b]

De juiste vorm is:

[a if C else b for i in items]

Ook al is er een geldig formulier:

[a for i in items if C]

Maar dat is niet hetzelfde als dat je op Cfiltert, maar ze kunnen worden gecombineerd:

[a if tC else b for i in items if fC]

Antwoord 4, autoriteit 19%

Je moet de expressie aan het begin van het lijstbegrip plaatsen, een if-statement aan het einde filtert elementen!

[x+1 if x >= 45 else x+5 for x in l]

Antwoord 5, autoriteit 5%

Zoals in [a if condition1 else b for i in list1 if condition2], de twee ifen met condition1en condition2twee verschillende dingen doet. Het deel (a if condition1 else b)komt uit een lambda-expressie:

lambda x: a if condition1 else b

terwijl de andere condition2een andere lambda is:

lambda x: condition2

Het volledige begrip van de lijst kan worden gezien als een combinatie van mapen filter:

map(lambda x: a if condition1 else b, filter(lambda x: condition2, list1))

Antwoord 6, autoriteit 3%

U kunt de voorwaardelijke uitdrukking ook tussen haakjes plaatsen in het lijstbegrip:

   l = [22, 13, 45, 50, 98, 69, 43, 44, 1]
    print [[x+5,x+1][x >= 45] for x in l]

[false,true][condition] is de syntaxis


Antwoord 7, autoriteit 2%

Ik had net een soortgelijk probleem en vond deze vraag en de antwoorden erg nuttig. Hier is het deel waar ik in de war over was. Ik schrijf het expliciet omdat niemand het gewoon in het Engels heeft gezegd:

De herhaling gaat aan het einde.

Normaal gesproken gaat er een lus

for this many times:
    if conditional: 
        do this thing
    else:
        do something else  

Iedereen vermeldt het gedeelte met het begrip lijst eenvoudig zoals het eerste antwoord deed,

[ expression for item in list if conditional ]

maar dat doe je in dit geval niet. (Ik probeerde het op die manier te doen)

In dit geval is het meer als volgt:

[ expression if conditional else other thing for this many times ] 

Antwoord 8

U kunt de voorwaarde verplaatsen naar:

v = [22, 13, 45, 50, 98, 69, 43, 44, 1]
[ (x+1 if x >=45 else x+5)  for x in v ]

Maar het begint er een beetje lelijk uit te zien, dus je kunt beter een normale lus gebruiken. Merk op dat ik vheb gebruikt in plaats van lvoor de lijstvariabele om verwarring met het cijfer 1 te verminderen (ik denk len Omoet onder alle omstandigheden worden vermeden als variabelenamen, zelfs in snelle en vuile voorbeeldcode).

LEAVE A REPLY

Please enter your comment!
Please enter your name here

13 − five =

Other episodes