Výber, nahradenie a transformácia konkrétnych prvkov zoznamov (polí) jazyka Python

obchodné

Ak chcete v jazyku Python vytvoriť nový zoznam extrahovaním alebo vymazaním iba tých prvkov existujúceho zoznamu (poľa), ktoré spĺňajú určité podmienky, alebo vykonaním výmeny či konverzie, použite porozumenie zoznamu.

Nasledujúci postup je vysvetlený spolu so vzorovým kódom.

  • Základná forma zápisu porozumenia zoznamu
  • Aplikovať postup na všetky prvky zoznamu
  • Výber a odstránenie prvkov zo zoznamu, ktoré spĺňajú kritériá
  • Nahradiť alebo konvertovať prvky, ktoré spĺňajú podmienky zoznamu

Konkrétne príklady zoznamov reťazcov nájdete v nasledujúcom článku.

Takisto je možné náhodne vybrať prvky, ktoré nespĺňajú kritériá.

Všimnite si, že zoznamy môžu uchovávať rôzne typy údajov a striktne sa líšia od polí. Ak chcete pracovať s poliami v procesoch, ktoré vyžadujú veľkosť pamäte a pamäťové adresy alebo numerické spracovanie veľkých dát, použite array (štandardná knižnica) alebo NumPy.

Nasledujúci zoznam je príkladom

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

Základná forma zápisu porozumenia zoznamu

Pri generovaní nového zoznamu zo zoznamu sa zoznam comprehensions píše jednoduchšie ako cykly for.

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

Výraz sa aplikuje na prvok, ktorý spĺňa podmienený výraz iterovateľného objektu (napríklad zoznamu alebo tuplu) a stane sa prvkom nového zoznamu. Výraz „if conditional expression“ možno vynechať, v takom prípade sa výraz aplikuje na všetky prvky.

Viac informácií vrátane zápisu vnoreného zoznamu nájdete v nasledujúcom článku.

Aplikovať postup na všetky prvky zoznamu

Ak chcete napríklad použiť nejaké spracovanie na všetky prvky zoznamu, opíšte požadované spracovanie vo vyššie uvedenom výraze na pochopenie zoznamu.

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

Túto funkciu možno použiť na prevod medzi zoznamami čísel a zoznamami reťazcov.

Výber a odstránenie prvkov zo zoznamu, ktoré spĺňajú kritériá

Ak má byť prvok vybraný iba podmieneným výrazom, nie je spracovaný výrazom, takže má nasledujúci tvar

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

Vytvorí sa nový zoznam, z ktorého sa vyberú len prvky, ktoré spĺňajú podmienku (prvky, pre ktoré je podmienkový výraz pravdivý).

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]

Ak je „if podmienený výraz“ nastavený na „if nie podmienený výraz“, stane sa z neho negácia a je možné vybrať a extrahovať iba prvky, ktoré nespĺňajú podmienku (prvky, pre ktoré je podmienený výraz nepravdivý). Inými slovami, vytvorí sa nový zoznam, z ktorého sa odstránia prvky, ktoré spĺňajú podmienku.

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]

Rovnaký výsledok sa samozrejme dosiahne aj zadaním ekvivalentného podmieneného výrazu bez použitia 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]

Súčasťou podmieneného výrazu môže byť viacero podmienok. Možno použiť aj záporné not.

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]

Nahradiť alebo konvertovať prvky, ktoré spĺňajú podmienky zoznamu

V uvedenom príklade extrakcie prvkov boli odstránené prvky, ktoré nespĺňali podmienky.

Ak chcete vykonávať substitúcie, konverzie atď. len na prvkoch, ktoré spĺňajú podmienky, použite ternárny operátor na výrazovú časť zápisu porozumenia zoznamu.

V jazyku Python možno ternárny operátor zapísať takto

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

Je to trochu komplikované, ale kombinácia zápisu porozumenia zoznamu a ternárnych operátorov je nasledovná.

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

Časť uzavretá v zátvorkách je ternárny operátor (zátvorky nie sú v skutočnom kóde potrebné).

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

Ak je názov premennej napísaný ako hodnota true alebo false, použije sa hodnota pôvodného prvku. Ak je napísaný výraz, použije sa spracovanie tohto výrazu.

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