Za generiranje novog popisa u Pythonu izdvajanjem ili brisanjem samo onih elemenata postojećeg popisa (niza) koji zadovoljavaju određene uvjete ili izvođenjem zamjene ili konverzije, koristite shvaćanja popisa.
Ovdje je objašnjeno sljedeće, zajedno s uzorkom koda.
- Osnovni oblik zapisa o razumijevanju popisa
- Primijenite postupak na sve elemente popisa
- Izdvojite i izbrišite elemente s popisa koji zadovoljavaju kriterije
- Zamijenite ili pretvorite elemente koji zadovoljavaju uvjete popisa
Pogledajte sljedeći članak za konkretne primjere popisa nizova.
Također je moguće nasumično izdvojiti elemente koji ne zadovoljavaju kriterije.
Imajte na umu da popisi mogu pohranjivati različite vrste podataka i da se striktno razlikuju od nizova. Ako želite rukovati nizovima u procesima koji zahtijevaju veličinu memorije i memorijske adrese ili numeričku obradu velikih podataka, koristite niz (standardna biblioteka) ili NumPy.
Sljedeći popis je primjer
l = list(range(-5, 6))
print(l)
# [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]
Osnovni oblik zapisa o razumijevanju popisa
Kada generirate novi popis iz popisa, shvaćanje popisa je jednostavnije napisati nego za petlje.
[expression for any variable name in iterable object if conditional expression]
Izraz se primjenjuje na element koji zadovoljava uvjetni izraz iterativnog objekta (kao što je popis ili tuple) i postaje element novog popisa. “Uvjetni izraz if” može se izostaviti, u kom slučaju se izraz primjenjuje na sve elemente.
Pogledajte sljedeći članak za više pojedinosti, uključujući notaciju razumijevanja ugniježđenog popisa.
Primijenite postupak na sve elemente popisa
Na primjer, ako želite primijeniti neku obradu na sve elemente popisa, opišite željenu obradu u gornjem izrazu za razumijevanje popisa.
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']
Ovo se može koristiti za pretvaranje između popisa brojeva i popisa nizova.
Izdvojite i izbrišite elemente s popisa koji zadovoljavaju kriterije
Ako element treba biti odabran samo uvjetnim izrazom, on se ne obrađuje izrazom, pa poprima sljedeći oblik
[variable name for variable name in original list if conditional expression]
Generira se nova lista iz koje se izdvajaju samo elementi koji zadovoljavaju uvjet (elementi za koje je uvjetni izraz istinit).
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]
Ako je “ako uvjetni izraz” postavljen na “ako nije uvjetni izraz”, on postaje negacija i mogu se odabrati i izdvojiti samo elementi koji ne zadovoljavaju uvjet (elementi za koje je uvjetni izraz netočan). Drugim riječima, generira se novi popis iz kojeg se uklanjaju elementi koji zadovoljavaju uvjet.
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]
Naravno, isti rezultat se dobiva specificiranjem ekvivalentnog uvjetnog izraza bez korištenja 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]
Dio uvjetnog izraza može biti više uvjeta. Mogu se koristiti i negativne note.
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]
Zamijenite ili pretvorite elemente koji zadovoljavaju uvjete popisa
U gornjem primjeru ekstrakcije elemenata uklonjeni su elementi koji nisu zadovoljili uvjete.
Ako želite izvršiti zamjene, pretvorbe itd. samo na elementima koji zadovoljavaju uvjete, primijenite ternarni operator na dio izraza u zapisu za razumijevanje popisa.
U Pythonu se ternarni operator može napisati na sljedeći 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
Malo je komplicirano, ali kombinacija notacije za razumijevanje popisa i ternarnih operatora je sljedeća.
[True Value if Conditional Expression else False Value for any variable name in original list]
Dio zatvoren u zagradama je ternarni operator (zagrade nisu potrebne u stvarnom kodu).
[(True Value if Conditional Expression else False Value) for any variable name in original list]
Ako je bilo koji naziv varijable napisan kao što jest za istinite ili lažne vrijednosti, vrijednost izvornog elementa koristi se onakva kakva jest. Ako je izraz napisan, primjenjuje se obrada tog 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]