logo

Python – porozumění seznamu

Pythonský seznam se skládá ze závorek obsahujících výraz, který se provádí pro každý prvek spolu s cyklem for pro iteraci každého prvku v seznamu Python.

Příklad:



Krajta






numbers>=> [>12>,>13>,>14>,]> doubled>=> [x>*>2> for> x>in> numbers]> print>(doubled)>



>

>

Výstup

[24, 26, 28]>

Python List Comprehension Syntaxe

Syntax: novýSeznam = [ výraz (prvek) pro živel v starý seznam -li stav ]

Parametr:

    expression : Představuje operaci, kterou chcete provést s každou položkou v iterovatelné. element : Termín proměnná se týká každé hodnoty převzaté z iterovatelného. iterable : zadejte posloupnost prvků, kterými chcete iterovat. (např. seznam, n-tice nebo řetězec). podmínka: (Volitelné) Filtr pomáhá rozhodnout, zda má být prvek přidán do nového seznamu.

Vrátit se: Vrácenou hodnotou porozumění seznamu je nový seznam obsahující upravené prvky, které splňují daná kritéria.

Python List comprehension poskytuje mnohem kratší syntaxi pro vytváření nového seznamu na základě hodnot existujícího seznamu.

Porozumění seznamu v příkladu Pythonu

Zde je příklad použití porozumění seznamu k nalezení druhé mocniny čísla v Pythonu.

Krajta




numbers>=> [>1>,>2>,>3>,>4>,>5>]> squared>=> [x>*>*> 2> for> x>in> numbers]> print>(squared)>

>

>

Výstup

[1, 4, 9, 16, 25]>

Iterace s porozuměním seznamu

V tomto příkladu přiřazujeme seznamu 1, 2 a 3 a tiskneme seznam pomocí funkce List Comprehension.

Krajta




# Using list comprehension to iterate through loop> List> => [character>for> character>in> [>1>,>2>,>3>]]> > # Displaying list> print>(>List>)>

>

>

Výstup

[1, 2, 3]>

Sudý seznam pomocí funkce List Comprehension

V tomto příkladu tiskneme sudá čísla od 0 do 10 pomocí funkce List Comprehension.

Krajta




list> => [i>for> i>in> range>(>11>)>if> i>%> 2> =>=> 0>]> print>(>list>)>

>

>

Výstup

[0, 2, 4, 6, 8, 10]>

Matice pomocí List Comprehension

V tomto příkladu přiřazujeme celá čísla 0 až 2 až 3 řádkům matice a tiskneme ji pomocí funkce List Comprehension.

Krajta




matrix>=> [[j>for> j>in> range>(>3>)]>for> i>in> range>(>3>)]> > print>(matrix)>

>

>

Výstup

[[0, 1, 2], [0, 1, 2], [0, 1, 2]]>

Seznam porozumění vs pro smyčku

Seznam lze iterovat různými způsoby. Nejběžnějším přístupem je však použití pro smyčka . Podívejme se na níže uvedený příklad:

Krajta




# Empty list> List> => []> > # Traditional approach of iterating> for> character>in> 'Geeks 4 Geeks!'>:> >List>.append(character)> > # Display list> print>(>List>)>

>

>

Výstup

['G', 'e', 'e', 'k', 's', ' ', '4', ' ', 'G', 'e', 'e', 'k', 's', '!']>

Výše je implementace tradičního přístupu k iteraci seznamem, řetězcem, n-ticí atd. Nyní, porozumění seznamu v Pythonu dělá stejný úkol a také zjednodušuje program.

List Comprehensions překládají tradiční iterační přístup pomocí pro smyčku do jednoduchého vzorce, díky čemuž se snadno používají. Níže je uveden přístup k iteraci seznamu, řetězce, n-tice atd. pomocí porozumění seznamu v Pythonu.

Krajta




# Using list comprehension to iterate through loop> List> => [character>for> character>in> 'Geeks 4 Geeks!'>]> > # Displaying list> print>(>List>)>

>

>

Výstup

['G', 'e', 'e', 'k', 's', ' ', '4', ' ', 'G', 'e', 'e', 'k', 's', '!']>

Časová analýza v List Comprehensions a Loop

Seznamy v Pythonu jsou efektivnější jak z hlediska výpočtu, tak z hlediska prostoru a času kódování než smyčka for. Obvykle jsou napsány na jednom řádku kódu. Níže uvedený program zobrazuje rozdíl mezi smyčkami a porozuměním seznamu na základě výkonu.

Krajta


regulární výraz v jazyce Java



# Import required module> import> time> > > # define function to implement for loop> def> for_loop(n):> >result>=> []> >for> i>in> range>(n):> >result.append(i>*>*>2>)> >return> result> > > # define function to implement list comprehension> def> list_comprehension(n):> >return> [i>*>*>2> for> i>in> range>(n)]> > > # Driver Code> > # Calculate time taken by for_loop()> begin>=> time.time()> for_loop(>10>*>*>6>)> end>=> time.time()> > # Display time taken by for_loop()> print>(>'Time taken for_loop:'>,>round>(end>->begin,>2>))> > # Calculate time takens by list_comprehension()> begin>=> time.time()> list_comprehension(>10>*>*>6>)> end>=> time.time()> > # Display time taken by for_loop()> print>(>'Time taken for list_comprehension:'>,>round>(end>->begin,>2>))>

>

>

Výstup

Time taken for_loop: 0.39 Time taken for list_comprehension: 0.35>

Z výše uvedeného programu vidíme, že porozumění seznamu je mnohem rychlejší než smyčka for.

Porozumění vnořených seznamů

Porozumění vnořených seznamů nejsou nic jiného než porozumění seznamu v rámci jiného porozumění seznamu, které je docela podobné vnořeným cyklům for. Níže je uveden program, který implementuje vnořenou smyčku:

Krajta




matrix>=> []> > for> i>in> range>(>3>):> > ># Append an empty sublist inside the list> >matrix.append([])> > >for> j>in> range>(>5>):> >matrix[i].append(j)> > print>(matrix)>

>

>

Výstup

[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]>

Nyní pomocí pochopení vnořených seznamů lze stejný výstup generovat na méně řádcích kódu.

Krajta




# Nested list comprehension> matrix>=> [[j>for> j>in> range>(>5>)]>for> i>in> range>(>3>)]> > print>(matrix)>

>

>

Výstup

[[0, 1, 2, 3, 4], [0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]>

Seznam porozumění a lambda

Lambda výrazy nejsou nic jiného než zkrácené reprezentace funkcí Pythonu. Použití porozumění seznamu s lambda vytváří účinnou kombinaci. Podívejme se na níže uvedené příklady:

V tomto příkladu vkládáme do seznamu čísla od 10 do 50 a tiskneme jej.

Krajta




# using lambda to print table of 10> numbers>=> []> > for> i>in> range>(>1>,>6>):> >numbers.append(i>*>10>)> > print>(numbers)>

>

>

Výstup

[10, 20, 30, 40, 50]>

Zde jsme použili for loop k vytištění tabulky 10.

Krajta




numbers>=> [i>*>10> for> i>in> range>(>1>,>6>)]> > print>(numbers)>

>

>

Výstup

[10, 20, 30, 40, 50]>

Nyní jsme k zobrazení tabulky 10 použili pouze porozumění seznamu.

Krajta




# using lambda to print table of 10> numbers>=> list>(>map>(>lambda> i: i>*>10>, [i>for> i>in> range>(>1>,>6>)]))> > print>(numbers)>

>

>

Výstup

[10, 20, 30, 40, 50]>

Nakonec použijeme lambda + porozumění seznamu k zobrazení tabulky 10. Tato kombinace je velmi užitečná pro získání efektivních řešení v méně řádcích kódu pro složité problémy.

Podmínky v porozumění seznamu

K porozumění seznamu můžeme také přidat podmíněné příkazy. Můžeme vytvořit seznam pomocí rozsah(), operátory , atd. a cal také aplikují některé podmínky na seznam pomocí if prohlášení .

Klíčové body

  • Porozumění seznamu je účinným prostředkem k popisu a vytváření seznamů na základě aktuálních seznamů.
  • Obecně platí, že porozumění seznamu je lehké a jednodušší než standardní funkce a smyčky pro vytváření seznamů.
  • Neměli bychom psát dlouhé kódy pro pochopení seznamu, abychom zajistili uživatelsky přívětivý kód.
  • Každé pochopení seznamu lze přepsat do cyklu for, ale v kontextu interpretace seznamu nelze přepsat každý cyklus for.

Níže je uvedeno několik příkladů, které znázorňují použití porozumění seznamu spíše než tradiční přístup k iteraci pomocí iterovatelnosti:

Python List Comprehension pomocí If-else.

V příkladu kontrolujeme, že od 0 do 7, pokud je číslo sudé, pak vložíme Sudé číslo do seznamu jinak vložit Liché číslo do seznamu.

Krajta




lis>=> [>'Even number'> if> i>%> 2> =>=> 0> >else> 'Odd number'> for> i>in> range>(>8>)]> print>(lis)>

>

>

Výstup

['Even number', 'Odd number', 'Even number', 'Odd number', 'Even number', 'Odd number', 'Even number', 'Odd number']>

Vnořené IF s porozuměním seznamu

V tomto příkladu vkládáme čísla do seznamu, který je násobkem 10 až 100, a tiskneme jej.

Krajta




lis>=> [num>for> num>in> range>(>100>)> >if> num>%> 5> =>=> 0> if> num>%> 10> =>=> 0>]> print>(lis)>

>

>

ipconfig pro ubuntu

Výstup

[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]>

Zobrazte čtverec čísel od 1 do 10

V tomto příkladu vkládáme čtverec od 1 do 10 do seznamu a tiskneme seznam.

Krajta




# Getting square of number from 1 to 10> squares>=> [n>*>*>2> for> n>in> range>(>1>,>11>)]> > # Display square of even numbers> print>(squares)>

>

>

Výstup

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]>

Zobrazení Transpozice 2D matice

V tomto příkladu provádíme transpozici matice pomocí porozumění seznamu.

Krajta




# Assign matrix> twoDMatrix>=> [[>10>,>20>,>30>],> >[>40>,>50>,>60>],> >[>70>,>80>,>90>]]> > # Generate transpose> trans>=> [[i[j]>for> i>in> twoDMatrix]>for> j>in> range>(>len>(twoDMatrix[>0>]))]> > print>(trans)>

>

>

Výstup

[[10, 40, 70], [20, 50, 80], [30, 60, 90]]>

Přepínání malých a velkých písmen každého znaku v řetězci

V tomto příkladu přepneme velikost písmen každého znaku v daném řetězci pomocí operátoru XOR s 32 a výsledek uložíme do seznamu.

Krajta




# Initializing string> string>=> 'Geeks4Geeks'> > # Toggle case of each character> List> => list>(>map>(>lambda> i:>chr>(>ord>(i) ^>32>), string))> > # Display list> print>(>List>)>

>

>

Výstup

['g', 'E', 'E', 'K', 'S', 'x14', 'g', 'E', 'E', 'K', 'S']>

Otočte každý řetězec v Tuple

V tomto příkladu obracíme řetězce ve smyčce for a vkládáme je do seznamu a tiskneme seznam.

Krajta




# Reverse each string in tuple> List> => [string[::>->1>]>for> string>in> (>'Geeks'>,>'for'>,>'Geeks'>)]> > # Display list> print>(>List>)>

>

>

Výstup

['skeeG', 'rof', 'skeeG']>

Vytvoření seznamu n-tic ze dvou samostatných seznamů

V tomto příkladu jsme vytvořili dva seznamy jména a věk. Používáme zip() v porozumění seznamu a do seznamu vkládáme jméno a věk jako n-tici. Nakonec vytiskneme seznam n-tic.

Krajta


ukázkový kód java



names>=> [>'G'>,>'G'>,>'g'>]> ages>=> [>25>,>30>,>35>]> person_tuples>=> [(name, age)>for> name, age>in> zip>(names, ages)]> print>(person_tuples)>

>

>

Výstup:

[('G', 25), ('G', 30), ('g', 35)]>

Zobrazí součet číslic všech lichých prvků v seznamu.

V tomto příkladu jsme vytvořili seznam a hledáme ciferný součet každého lichého prvku v seznamu.

Krajta




# Explicit function> def> digitSum(n):> >dsum>=> 0> >for> ele>in> str>(n):> >dsum>+>=> int>(ele)> >return> dsum> > > # Initializing list> List> => [>367>,>111>,>562>,>945>,>6726>,>873>]> > # Using the function on odd elements of the list> newList>=> [digitSum(i)>for> i>in> List> if> i &>1>]> > # Displaying new list> print>(newList)>

>

>

Výstup

[16, 3, 18, 18]>

Výhody porozumění seznamu

  • Časově i prostorově efektivnější než smyčky.
  • Vyžadovat méně řádků kódu.
  • Převede iterační příkaz na vzorec.

Otázky pro cvičení k porozumění seznamu v Pythonu

Níže jsou uvedeny dvě cvičné otázky týkající se porozumění seznamu v Pythonu. Popsali jsme základní kód pro porozumění seznamu pro nalezení kostky čísel a kód pro zjištění délky slova pomocí funkce list comprehension a funkce len().

Q1. Cvičební otázka krychle čísel pomocí porozumění seznamu

Krajta




numbers>=> [>1>,>2>,>3>,>4>,>5>,>6>,>7>,>8>,>9>,>10>]> cube>=> [number>*>*>3> for> number>in> numbers]> print>(cube)>

>

>

Výstup

[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]>

Q2. Otázka na hledání délky slova pomocí porozumění seznamu

Krajta




words>=> [>'apple'>,>'banana'>,>'cherry'>,>'orange'>]> word_lengths>=> [>len>(word)>for> word>in> words]> print>(word_lengths)>

>

>

Výstup

[5, 6, 6, 6]>