Specifieke elementen van Python-lijsten (arrays) extraheren, vervangen en transformeren

Bedrijf

Om in Python een nieuwe lijst te genereren door alleen die elementen uit een bestaande lijst (array) te halen of te verwijderen die aan bepaalde voorwaarden voldoen, of door vervangingen of conversies uit te voeren, gebruik je list comprehensions.

Het volgende wordt hier uitgelegd, samen met voorbeeldcode.

  • Basisvorm van notatie van lijstbegrip
  • Pas het proces toe op alle elementen van de lijst
  • elementen uit de lijst halen en verwijderen die aan de criteria voldoen
  • Vervang of converteer elementen die aan de voorwaarden van de lijst voldoen

Zie het volgende artikel voor specifieke voorbeelden van lijsten met tekenreeksen.

Het is ook mogelijk om willekeurig elementen te extraheren die niet aan de criteria voldoen.

Merk op dat lijsten verschillende soorten gegevens kunnen opslaan en strikt verschillend zijn van arrays. Als u arrays wilt verwerken in processen die geheugengrootte en geheugenadressen vereisen of numerieke verwerking van grote gegevens, gebruik dan array (standaardbibliotheek) of NumPy.

De volgende lijst is een voorbeeld

l = list(range(-5, 6))
print(l)
# [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]

Basisvorm van notatie van lijstbegrip

Bij het genereren van een nieuwe lijst uit een lijst, zijn list comprehensions eenvoudiger te schrijven dan for loops.

[expression for any variable name in iterable object if conditional expression]

Een uitdrukking wordt toegepast op een element dat voldoet aan de voorwaardelijke uitdrukking van een iterabel object (zoals een lijst of tupel) en wordt een element van een nieuwe lijst. De “indien voorwaardelijke expressie” kan worden weggelaten, in welk geval de expressie wordt toegepast op alle elementen.

Zie het volgende artikel voor meer details, inclusief geneste lijstbegrip notatie.

Pas het proces toe op alle elementen van de lijst

Bijvoorbeeld, als je een bewerking wilt toepassen op alle elementen van een lijst, beschrijf dan de gewenste bewerking in de lijst comprehensie uitdrukking hierboven.

l_square = [i**2 for i in l]
print(l_square)
# [25, 16, 9, 4, 1, 0, 1, 4, 9, 16, 25]

l_str = [str(i) for i in l]
print(l_str)
# ['-5', '-4', '-3', '-2', '-1', '0', '1', '2', '3', '4', '5']

Dit kan worden gebruikt om te converteren tussen lijsten met getallen en lijsten met tekenreeksen.

elementen uit de lijst halen en verwijderen die aan de criteria voldoen

Als het element alleen moet worden geselecteerd door een voorwaardelijke uitdrukking, wordt het niet verwerkt door een uitdrukking, dus neemt het de volgende vorm aan

[variable name for variable name in original list if conditional expression]

Er wordt een nieuwe lijst gegenereerd waaruit alleen elementen worden geëxtraheerd die aan de voorwaarde voldoen (elementen waarvoor de voorwaardelijke uitdrukking waar is).

l_even = [i for i in l if i % 2 == 0]
print(l_even)
# [-4, -2, 0, 2, 4]

l_minus = [i for i in l if i < 0]
print(l_minus)
# [-5, -4, -3, -2, -1]

Als “indien voorwaardelijke uitdrukking” wordt ingesteld op “indien niet voorwaardelijke uitdrukking”, wordt het een negatie, en alleen elementen die niet aan de voorwaarde voldoen (elementen waarvoor de voorwaardelijke uitdrukking onwaar is) kunnen worden geselecteerd en geëxtraheerd. Met andere woorden, er wordt een nieuwe lijst gegenereerd waaruit elementen die aan de voorwaarde voldoen, worden verwijderd.

l_odd = [i for i in l if not i % 2 == 0]
print(l_odd)
# [-5, -3, -1, 1, 3, 5]

l_plus = [i for i in l if not i < 0]
print(l_plus)
# [0, 1, 2, 3, 4, 5]

Hetzelfde resultaat wordt natuurlijk verkregen door de equivalente voorwaardelijke uitdrukking te specificeren zonder not te gebruiken.

l_odd = [i for i in l if i % 2 != 0]
print(l_odd)
# [-5, -3, -1, 1, 3, 5]

l_plus = [i for i in l if i >= 0]
print(l_plus)
# [0, 1, 2, 3, 4, 5]

Het voorwaardelijke uitdrukkingsdeel kan uit meerdere voorwaarden bestaan. Negatieve nieten kunnen ook worden gebruikt.

l_minus_or_even = [i for i in l if (i < 0) or (i % 2 == 0)]
print(l_minus_or_even)
# [-5, -4, -3, -2, -1, 0, 2, 4]

l_minus_and_odd = [i for i in l if (i < 0) and not (i % 2 == 0)]
print(l_minus_and_odd)
# [-5, -3, -1]

Vervang of converteer elementen die aan de voorwaarden van de lijst voldoen

In het voorbeeld van de extractie van elementen hierboven, werden elementen die niet aan de voorwaarden voldeden verwijderd.

Als u substituties, conversies, enz. alleen wilt uitvoeren op elementen die aan de voorwaarden voldoen, past u de ternaire operator toe op het uitdrukkingsdeel van de lijstbegripnotatie.

In Python kan de ternaire operator als volgt worden geschreven

True Value if Conditional Expression else False Value
a = 80
x = 100 if a > 50 else 0
print(x)
# 100

b = 30
y = 100 if b > 50 else 0
print(y)
# 0

Het is een beetje ingewikkeld, maar de combinatie van lijstbegripnotatie en ternaire operatoren is als volgt.

[True Value if Conditional Expression else False Value for any variable name in original list]

Het gedeelte tussen haakjes is de ternaire operator (haakjes zijn niet nodig in de eigenlijke code).

[(True Value if Conditional Expression else False Value) for any variable name in original list]

Indien een variabelenaam wordt geschreven als is voor waar of onwaar waarden, wordt de waarde van het oorspronkelijke element gebruikt als is. Als een uitdrukking wordt geschreven, wordt de verwerking van die uitdrukking toegepast.

l_replace = [100 if i > 0 else i for i in l]
print(l_replace)
# [-5, -4, -3, -2, -1, 0, 100, 100, 100, 100, 100]

l_replace2 = [100 if i > 0 else 0 for i in l]
print(l_replace2)
# [0, 0, 0, 0, 0, 0, 100, 100, 100, 100, 100]

l_convert = [i * 10 if i % 2 == 0 else i for i in l]
print(l_convert)
# [-5, -40, -3, -20, -1, 0, 1, 20, 3, 40, 5]

l_convert2 = [i * 10 if i % 2 == 0 else i / 10 for i in l]
print(l_convert2)
# [-0.5, -40, -0.3, -20, -0.1, 0, 0.1, 20, 0.3, 40, 0.5]