Udtrække, erstatte og omdanne specifikke elementer i Python-lister (arrays)

Forretning

Hvis du vil generere en ny liste i Python ved kun at udtrække eller slette de elementer af en eksisterende liste (array), der opfylder visse betingelser, eller ved at foretage udskiftninger eller konverteringer, skal du bruge list comprehensions.

Følgende forklares her sammen med en kodeeksempel.

  • Grundlæggende form for notation af listeforståelse
  • Anvend processen på alle elementerne i listen
  • Udtrække og slette elementer fra listen, der opfylder kriterierne
  • Udskift eller konverter elementer, der opfylder betingelserne i listen

Se den følgende artikel for specifikke eksempler på lister med strenge.

Det er også muligt at udtrække tilfældigt elementer, der ikke opfylder kriterierne.

Bemærk, at lister kan lagre forskellige typer data og er helt forskellige fra arrays. Hvis du ønsker at håndtere arrays i processer, der kræver hukommelsesstørrelse og hukommelsesadresser eller numerisk behandling af store data, skal du bruge array (standardbiblioteket) eller NumPy.

Følgende liste er et eksempel

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

Grundlæggende form for notation af listeforståelse

Når der skal genereres en ny liste fra en liste, er list comprehensions enklere at skrive end for-loops.

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

Et udtryk anvendes på et element, der opfylder det betingede udtryk for et iterbart objekt (f.eks. en liste eller tupel), og bliver et element i en ny liste. “if betinget udtryk” kan udelades, i hvilket tilfælde udtrykket anvendes på alle elementer.

Se den følgende artikel for flere oplysninger, herunder notation af nested list comprehension.

Anvend processen på alle elementerne i listen

Hvis du f.eks. ønsker at anvende en behandling på alle elementerne i en liste, skal du beskrive den ønskede behandling i ovenstående listeforståelsesudtryk.

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

Dette kan bruges til at konvertere mellem lister med tal og lister med strenge.

Udtrække og slette elementer fra listen, der opfylder kriterierne

Hvis elementet kun skal vælges ved hjælp af et betinget udtryk, behandles det ikke ved hjælp af et udtryk, så det har følgende form

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

Der genereres en ny liste, hvorfra kun de elementer, der opfylder betingelsen (elementer, for hvilke det betingede udtryk er sandt), udtrækkes.

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]

Hvis “hvis betinget udtryk” er sat til “hvis ikke betinget udtryk”, bliver det en negation, og kun elementer, der ikke opfylder betingelsen (elementer, for hvilke det betingede udtryk er falsk), kan vælges og udtrækkes. Der genereres med andre ord en ny liste, hvorfra de elementer, der opfylder betingelsen, fjernes.

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]

Man kan naturligvis opnå det samme resultat ved at angive det tilsvarende betingede udtryk uden at bruge 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 betingede udtryksdel kan være flere betingelser. Negative nots kan også anvendes.

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]

Udskift eller konverter elementer, der opfylder betingelserne i listen

I eksemplet med udtrækning af elementer ovenfor blev de elementer, der ikke opfyldte betingelserne, fjernet.

Hvis du kun vil udføre substitutioner, konverteringer osv. på de elementer, der opfylder betingelserne, skal du anvende den ternære operatør på udtryksdelen af listeforståelsesnotationen.

I Python kan den ternære operatør skrives på følgende måde

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 er en smule kompliceret, men kombinationen af list comprehension notation og ternære operatorer er som følger.

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

Den del, der er omsluttet af parenteser, er den ternære operator (parenteser er ikke nødvendige i den egentlige kode).

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

Hvis et variabelnavn er skrevet som værende for sand eller falsk værdier, anvendes værdien af det oprindelige element som værende. Hvis der er skrevet et udtryk, anvendes behandlingen af dette udtryk.

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