Extrahera, ersätta och omvandla specifika element i Python-listor (matriser).

Företag

Använd list comprehensions för att skapa en ny lista i Python genom att extrahera eller ta bort endast de element i en befintlig lista (array) som uppfyller vissa villkor, eller genom att utföra ersättningar eller konverteringar.

Följande förklaras här, tillsammans med exempelkod.

  • Grundläggande form av notation för listförståelse
  • Tillämpa processen på alla element i listan.
  • Extrahera och ta bort element från listan som uppfyller kriterierna.
  • Ersätt eller omvandla element som uppfyller villkoren i listan.

I följande artikel finns specifika exempel på listor med strängar.

Det är också möjligt att slumpmässigt ta ut element som inte uppfyller kriterierna.

Observera att listor kan lagra olika typer av data och skiljer sig strikt från matriser. Om du vill hantera matriser i processer som kräver minnesstorlek och minnesadresser eller numerisk behandling av stora data, använd array (standardbiblioteket) eller NumPy.

Följande förteckning är ett exempel

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

Grundläggande form av notation för listförståelse

När du skapar en ny lista från en lista är listförståelser enklare att skriva än for-slingor.

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

Ett uttryck tillämpas på ett element som uppfyller det villkorliga uttrycket för ett iterbart objekt (t.ex. en lista eller tupel) och blir ett element i en ny lista. ”Om villkorligt uttryck” kan utelämnas, i så fall tillämpas uttrycket på alla element.

Se följande artikel för mer information, inklusive notering för förståelse av en nästlad lista.

Tillämpa processen på alla element i listan.

Om du till exempel vill tillämpa en viss bearbetning på alla element i en lista beskriver du den önskade bearbetningen i listförståelseuttrycket ovan.

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']

Detta kan användas för att konvertera mellan listor med tal och listor med strängar.

Extrahera och ta bort element från listan som uppfyller kriterierna.

Om elementet endast ska väljas med hjälp av ett villkorligt uttryck behandlas det inte med ett uttryck, så det har följande form

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

En ny lista skapas från vilken endast element som uppfyller villkoret (element för vilka det villkorliga uttrycket är sant) extraheras.

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]

Om ”om villkorligt uttryck” sätts till ”om inte villkorligt uttryck” blir det en negation, och endast element som inte uppfyller villkoret (element för vilka det villkorliga uttrycket är falskt) kan väljas och extraheras. Med andra ord skapas en ny lista från vilken element som uppfyller villkoret tas bort.

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]

Samma resultat kan givetvis uppnås genom att ange ett motsvarande villkorligt uttryck utan att använda not.

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]

Den villkorliga uttrycksdelen kan vara flera villkor. Negativa nots kan också användas.

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]

Ersätt eller omvandla element som uppfyller villkoren i listan.

I exemplet med extraktion av element ovan togs element som inte uppfyllde villkoren bort.

Om du vill utföra substitutioner, konverteringar osv. endast på element som uppfyller villkoren tillämpar du den ternära operatören på uttrycksdelen av listförståelsen.

I Python kan den ternära operatören skrivas på följande sätt

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

Det är lite komplicerat, men kombinationen av listförståelsenotation och ternära operatörer är följande.

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

Den del som är omsluten av parenteser är den ternära operatorn (parenteser är inte nödvändiga i den faktiska koden).

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

Om ett variabelnamn är skrivet som det är för sanna eller falska värden, används det ursprungliga elementets värde som det är. Om ett uttryck skrivs tillämpas behandlingen av det uttrycket.

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]
Copied title and URL