V tomto článku se dozvíme o porozumění seznamu Pythonu a o tom, jak jej používat.
Seznamte porozumění vs pro smyčku v Pythonu
Předpokládejme, že chceme oddělit písmena slova human
a přidat písmena jako položky seznamu. První věc, která přijde na mysl, by bylo použití pro smyčku.
Příklad 1: Iterace řetězcem Using for Loop
h_letters = () for letter in 'human': h_letters.append(letter) print(h_letters)
Když spustíme program, výstup bude:
('h', 'u', 'm', 'a', 'n')
Python má však jednodušší způsob, jak vyřešit tento problém pomocí List Comprehension. Seznam s porozuměním je elegantní způsob, jak definovat a vytvářet seznamy na základě existujících seznamů.
Podívejme se, jak lze výše uvedený program napsat pomocí porozumění seznamu.
Příklad 2: Iterace řetězcem pomocí seznamu s porozuměním
h_letters = ( letter for letter in 'human' ) print( h_letters)
Když spustíme program, výstup bude:
('h', 'u', 'm', 'a', 'n')
Ve výše uvedeném příkladu je nový seznam přiřazen proměnné h_letters a seznam obsahuje položky iterovatelného řetězce 'human'. Voláme print()
funkci pro příjem výstupu.
Syntaxe porozumění seznamu
(výraz pro položku v seznamu)
Nyní můžeme určit, kde se používají porozumění seznamu.
Pokud jste si všimli, human
je řetězec, nikoli seznam. To je síla porozumění seznamu. Může identifikovat, kdy obdrží řetězec nebo n-tici, a pracovat na ní jako na seznamu.
Můžete to udělat pomocí smyček. Ne každá smyčka však může být přepsána jako seznamové porozumění. Ale jak se naučíte porozumět seznamům a budete se s nimi dobře seznámit, zjistíte, že touto elegantní syntaxí nahrazujete stále více smyček.
Seznam funkcí Porozumění vs Lambda
Porozumění seznamu není jediný způsob, jak na seznamech pracovat. Různé integrované funkce a funkce lambda mohou vytvářet a upravovat seznamy v méně řádcích kódu.
Příklad 3: Použití funkcí Lambda v seznamu
letters = list(map(lambda x: x, 'human')) print(letters)
Když spustíme program, výstup bude
('člověk')
Srozumitelnosti seznamu jsou však obvykle čitelnější než funkce lambda. Je snazší pochopit, čeho se programátor snažil dosáhnout, když jsou použity seznamy.
Podmínky v porozumění seznamu
Porozumění seznamu může využít podmíněné prohlášení k úpravě existujícího seznamu (nebo jiných n-tic). Vytvoříme seznam, který používá matematické operátory, celá čísla a range ().
Příklad 4: Použití if s porozuměním seznamu
number_list = ( x for x in range(20) if x % 2 == 0) print(number_list)
Když spustíme výše uvedený program, výstup bude:
(0, 2, 4, 6, 8, 10, 12, 14, 16, 18)
Seznam, number_list, bude naplněn položkami v rozsahu od 0-19, pokud je hodnota položky dělitelná 2.
Příklad 5: Vnořené IF s porozuměním seznamu
num_list = (y for y in range(100) if y % 2 == 0 if y % 5 == 0) print(num_list)
Když spustíme výše uvedený program, výstup bude:
(0, 10, 20, 30, 40, 50, 60, 70, 80, 90)
Zde seznam kontrol porozumění:
- Je y dělitelné 2 nebo ne?
- Je y dělitelné 5 nebo ne?
Pokud y splňuje obě podmínky, je y připojeno k num_list.
Příklad 6: pokud… jinak S porozuměním seznamu
obj = ("Even" if i%2==0 else "Odd" for i in range(10)) print(obj)
Když spustíme výše uvedený program, výstup bude:
('Sudý', 'Zvláštní', 'Sudý', 'Zvláštní', 'Sudý', 'Zvláštní', 'Sudý', 'Zvláštní', 'Sudý', 'Zvláštní')
Here, list comprehension will check the 10 numbers from 0 to 9. If i is divisible by 2, then Even
is appended to the obj list. If not, Odd
is appended.
Nested Loops in List Comprehension
Suppose, we need to compute the transpose of a matrix that requires nested for loop. Let’s see how it is done using normal for loop first.
Example 7: Transpose of Matrix using Nested Loops
transposed = () matrix = ((1, 2, 3, 4), (4, 5, 6, 8)) for i in range(len(matrix(0))): transposed_row = () for row in matrix: transposed_row.append(row(i)) transposed.append(transposed_row) print(transposed)
Output
((1, 4), (2, 5), (3, 6), (4, 8))
The above code use two for loops to find transpose of the matrix.
We can also perform nested iteration inside a list comprehension. In this section, we will find transpose of a matrix using nested loop inside list comprehension.
Example 8: Transpose of a Matrix using List Comprehension
matrix = ((1, 2), (3,4), (5,6), (7,8)) transpose = ((row(i) for row in matrix) for i in range(2)) print (transpose)
When we run the above program, the output will be:
((1, 3, 5, 7), (2, 4, 6, 8))
In above program, we have a variable matrix which have 4
rows and 2
columns.We need to find transpose of the matrix. For that, we used list comprehension.
**Note: The nested loops in list comprehension don’t work like normal nested loops. In the above program, for i in range(2)
is executed before row(i) for row in matrix
. Hence at first, a value is assigned to i then item directed by row(i)
is appended in the transpose variable.
Key Points to Remember
- List comprehension is an elegant way to define and create lists based on existing lists.
- List comprehension is generally more compact and faster than normal functions and loops for creating list.
- However, we should avoid writing very long list comprehensions in one line to ensure that code is user-friendly.
- Nezapomeňte, že každé porozumění seznamu lze přepsat na smyčku for, ale každou smyčku for nelze přepsat ve formě porozumění seznamu.