Výběr, nahrazení a transformace konkrétních prvků seznamů (polí) jazyka Python

Podnikání

Chcete-li v jazyce Python vytvořit nový seznam vyjmutím nebo odstraněním pouze těch prvků existujícího seznamu (pole), které splňují určité podmínky, nebo provedením záměn či konverzí, použijte seznamy s porozuměním.

Zde je vysvětlen následující postup spolu s ukázkovým kódem.

  • Základní forma zápisu pro porozumění seznamu
  • Použijte tento postup na všechny prvky seznamu
  • Výběr a odstranění prvků ze seznamu, které splňují kritéria.
  • Nahradit nebo převést prvky, které splňují podmínky seznamu.

Konkrétní příklady seznamů řetězců najdete v následujícím článku.

Je také možné náhodně vybírat prvky, které nesplňují kritéria.

Všimněte si, že seznamy mohou uchovávat různé typy dat a striktně se liší od polí. Pokud chcete s poli pracovat v procesech, které vyžadují velikost paměti a paměťové adresy nebo numerické zpracování velkých dat, použijte pole (standardní knihovna) nebo NumPy.

Následující seznam je příkladem

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

Základní forma zápisu pro porozumění seznamu

Při generování nového seznamu ze seznamu je zápis seznamů jednodušší než zápis cyklů for.

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

Výraz je aplikován na prvek, který splňuje podmíněný výraz iterovatelného objektu (například seznamu nebo tuple) a stane se prvkem nového seznamu. Výraz „if conditional expression“ lze vynechat, v takovém případě se výraz aplikuje na všechny prvky.

Další podrobnosti včetně zápisu vnořeného seznamu naleznete v následujícím článku.

Použijte tento postup na všechny prvky seznamu

Chcete-li například použít nějaké zpracování na všechny prvky seznamu, popište požadované zpracování ve výše uvedeném výrazu pro porozumění seznamu.

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 lze použít k převodu mezi seznamy čísel a seznamy řetězců.

Výběr a odstranění prvků ze seznamu, které splňují kritéria.

Pokud má být prvek vybrán pouze podmíněným výrazem, není zpracován výrazem, takže má následující podobu

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

Je vygenerován nový seznam, ze kterého jsou vybrány pouze prvky splňující podmínku (prvky, pro které je podmíněný 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]

Pokud je „if podmíněný výraz“ nastaven na „if není podmíněný výraz“, stane se z něj negace a lze vybrat a extrahovat pouze prvky, které podmínce nevyhovují (prvky, pro které je podmíněný výraz nepravdivý). Jinými slovy, vytvoří se nový seznam, z něhož se odstraní prvky, které podmínku splňují.

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]

Stejného výsledku samozřejmě dosáhneme i zadáním ekvivalentního podmíněného výrazu bez použití 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]

Součástí podmíněného výrazu může být více podmínek. Lze použít i 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]

Nahradit nebo převést prvky, které splňují podmínky seznamu.

Ve výše uvedeném příkladu extrakce prvků byly odstraněny prvky, které nesplňovaly podmínky.

Pokud chcete provádět substituce, konverze atd. pouze na prvcích, které splňují podmínky, použijte ternární operátor na výrazovou část zápisu porozumění seznamu.

V jazyce Python lze ternární operátor zapsat 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 složitější, ale kombinace notace pro porozumění seznamu a ternárních operátorů je následující.

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

Část uzavřená v závorkách je ternární operátor (závorky nejsou ve skutečném kódu nutné).

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

Pokud je název proměnné zapsán jako is pro hodnoty true nebo false, použije se hodnota původního prvku tak, jak je. Pokud je zapsán výraz, použije se zpracování tohoto 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]