Izvleček, zamenjava in preoblikovanje določenih elementov seznamov (polj) v programu Python.

Posel

Če želite v Pythonu ustvariti nov seznam tako, da iz obstoječega seznama (polja) odstranite ali izbrišete samo tiste elemente, ki izpolnjujejo določene pogoje, ali izvedete zamenjave ali pretvorbe, uporabite razumevanje seznamov.

V nadaljevanju je razloženo naslednje, skupaj z vzorčno kodo.

  • Osnovna oblika zapisa za razumevanje seznama
  • Postopek uporabite za vse elemente seznama
  • Izbiranje in brisanje elementov s seznama, ki izpolnjujejo merila.
  • Zamenjajte ali pretvorite elemente, ki izpolnjujejo pogoje seznama.

Posebne primere seznamov nizov si oglejte v naslednjem članku.

Možno je tudi naključno izločiti elemente, ki ne izpolnjujejo meril.

Upoštevajte, da lahko seznami shranjujejo različne vrste podatkov in se bistveno razlikujejo od polj. Če želite z nizi ravnati v procesih, ki zahtevajo velikost pomnilnika in pomnilniške naslove ali numerično obdelavo velikih podatkov, uporabite array (standardna knjižnica) ali NumPy.

Naslednji seznam je primer

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

Osnovna oblika zapisa za razumevanje seznama

Pri ustvarjanju novega seznama iz seznama je razumevanje seznamov enostavnejše za pisanje kot zanke for.

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

Izraz se uporabi za element, ki izpolnjuje pogojni izraz iterabilnega objekta (kot je seznam ali tuple) in postane element novega seznama. Pogojni izraz “if” lahko izpustite, v tem primeru se izraz uporabi za vse elemente.

Za več podrobnosti, vključno z zapisom za razumevanje ugnezdenih seznamov, glejte naslednji članek.

Postopek uporabite za vse elemente seznama

Če želite na primer obdelati vse elemente seznama, opišite želeno obdelavo v zgornjem izrazu za razumevanje seznama.

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

To lahko uporabite za pretvorbo med seznami števil in seznami nizov.

Izbiranje in brisanje elementov s seznama, ki izpolnjujejo merila.

Če se element izbere le s pogojnim izrazom, se ne obdela z izrazom, zato ima naslednjo obliko

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

Ustvari se nov seznam, iz katerega se izločijo samo elementi, ki izpolnjujejo pogoj (elementi, za katere je pogojni izraz resničen).

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]

Če je “če pogojni izraz” nastavljen na “če ni pogojni izraz”, postane negacija in izberete in izločite lahko samo elemente, ki ne izpolnjujejo pogoja (elemente, za katere je pogojni izraz napačen). Z drugimi besedami, ustvari se nov seznam, s katerega se odstranijo elementi, ki izpolnjujejo pogoj.

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]

Seveda lahko enak rezultat dosežemo tudi z navedbo enakovrednega pogojnega izraza brez uporabe 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]

Del pogojnega izraza je lahko več pogojev. Uporabljajo se lahko tudi negativni ne.

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]

Zamenjajte ali pretvorite elemente, ki izpolnjujejo pogoje seznama.

V zgornjem primeru izločanja elementov so bili odstranjeni elementi, ki niso izpolnjevali pogojev.

Če želite zamenjave, pretvorbe itd. izvesti samo na elementih, ki izpolnjujejo pogoje, uporabite ternarni operator za izrazni del zapisa za razumevanje seznama.

V jeziku Python lahko ternarni operator zapišemo na naslednji način

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

To je nekoliko zapleteno, vendar je kombinacija zapisa za razumevanje seznamov in ternarnih operatorjev naslednja.

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

Del, zaprt v oklepajih, je trojni operator (v dejanski kodi oklepaji niso potrebni).

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

Če je katero koli ime spremenljivke za vrednosti true ali false zapisano kot je, se vrednost prvotnega elementa uporabi kot je. Če je zapisan izraz, se uporabi obdelava tega izraza.

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]