V tomto výukovém programu se na příkladech seznámíme s porozuměním slovníku Pythonu a jeho používáním.
Slovníky jsou datové typy v Pythonu, což nám umožňuje ukládat data do dvojice klíč / hodnota . Například:
my_dict = (1: 'apple', 2: 'ball')
Chcete-li se o nich dozvědět více, navštivte: Slovník Pythonu
Co je slovníkové porozumění v Pythonu?
Porozumění slovníku je elegantní a výstižný způsob vytváření slovníků.
Příklad 1: Porozumění slovníku
Zvažte následující kód:
square_dict = dict() for num in range(1, 11): square_dict(num) = num*num print(square_dict)
Nyní vytvořme slovník ve výše uvedeném programu pomocí porozumění slovníku.
# dictionary comprehension example square_dict = (num: num*num for num in range(1, 11)) print(square_dict)
Výstup obou programů bude stejný.
(1: 1, 2: 4, 3: 9, 4: 16, 5:25, 6: 36, 7: 49, 8: 64, 9: 81, 10: 100)
V obou programech jsme vytvořili slovník square_dict
s dvojicí klíč / hodnota číselný čtverec .
Použití porozumění slovníku nám však umožnilo vytvořit slovník v jednom řádku .
Použití slovníku s porozuměním
Z výše uvedeného příkladu vidíme, že porozumění slovníku by mělo být napsáno konkrétním vzorem.
Minimální syntaxe pro porozumění slovníku je:
dictionary = (key: value for vars in iterable)
Porovnejme tuto syntaxi s porozuměním slovníku z výše uvedeného příkladu.
Nyní se podívejme, jak můžeme použít porozumění slovníku pomocí dat z jiného slovníku.
Příklad 3: Jak používat slovníkové porozumění
#item price in dollars old_price = ('milk': 1.02, 'coffee': 2.5, 'bread': 2.5) dollar_to_pound = 0.76 new_price = (item: value*dollar_to_pound for (item, value) in old_price.items()) print(new_price)
Výstup
(„mléko“: 0,7752, „káva“: 1,9, „chléb“: 1,9)
Zde vidíme, že jsme načetli ceny zboží v dolarech a převedli je na libry. Díky použití slovníku je tento úkol mnohem jednodušší a kratší.
Podmíněné výrazy ve výkladu slovníku
Můžeme dále přizpůsobit porozumění slovníku přidáním podmínek. Podívejme se na příklad.
Příklad 4: Je-li podmíněné porozumění slovníku
original_dict = ('jack': 38, 'michael': 48, 'guido': 57, 'john': 33) even_dict = (k: v for (k, v) in original_dict.items() if v % 2 == 0) print(even_dict)
Výstup
('jack': 38, 'michael': 48)
Jak vidíme, byly přidány pouze položky se sudou hodnotou, kvůli if
klauzuli ve výkladu slovníku.
Příklad 5: Vícenásobné porozumění podmíněného slovníku
original_dict = ('jack': 38, 'michael': 48, 'guido': 57, 'john': 33) new_dict = (k: v for (k, v) in original_dict.items() if v % 2 != 0 if v < 40) print(new_dict)
Výstup
('john': 33)
V tomto případě byly do nového slovníku přidány pouze položky s lichou hodnotou menší než 40.
Je to kvůli několika if
větám ve slovníku s porozuměním. Jsou ekvivalentní and
provozu, kde musí být obě podmínky pravdivé.
Příklad 6: Podmíněné porozumění slovníku if-else
original_dict = ('jack': 38, 'michael': 48, 'guido': 57, 'john': 33) new_dict_1 = (k: ('old' if v> 40 else 'young') for (k, v) in original_dict.items()) print(new_dict_1)
Výstup
('jack': 'young', 'michael': 'old', 'guido': 'old', 'john': 'young')
V tomto případě je nový slovník vytvořen pomocí porozumění slovníku.
Položky s hodnotou 40 a více mají hodnotu „starého“, zatímco jiné mají hodnotu „mladého“.
Pochopení vnořeného slovníku
Můžeme přidat porozumění slovníku k samotnému porozumění slovníku, abychom vytvořili vnořené slovníky. Podívejme se na příklad.
Příklad 7: Vnořený slovník se dvěma výkladovými slovníky
dictionary = ( k1: (k2: k1 * k2 for k2 in range(1, 6)) for k1 in range(2, 5) ) print(dictionary)
Výstup
(2: (1: 2, 2: 4, 3: 6, 4: 8, 5: 10), 3: (1: 3, 2: 6, 3: 9, 4: 12, 5: 15), 4: (1: 4, 2: 8, 3: 12, 4: 16, 5: 20))
As you can see, we have constructed a multiplication table in a nested dictionary, for numbers from 2 to 4.
Whenever nested dictionary comprehension is used, Python first starts from the outer loop and then goes to the inner one.
So, the above code would be equivalent to:
dictionary = dict() for k1 in range(11, 16): dictionary(k1) = (k2: k1*k2 for k2 in range(1, 6)) print(dictionary)
It can further be unfolded:
dictionary = dict() for k1 in range(11, 16): dictionary(k1) = dict() for k2 in range(1, 6): dictionary(k1)(k2) = k1*k2 print(dictionary)
All these three programs give us the same output.
Advantages of Using Dictionary Comprehension
As we can see, dictionary comprehension shortens the process of dictionary initialization by a lot. It makes the code more pythonic.
Using dictionary comprehension in our code can shorten the lines of code while keeping the logic intact.
Warnings on Using Dictionary Comprehension
I když jsou srozumitelné slovníky skvělé pro psaní elegantního kódu, který je snadno čitelný, nejsou vždy správnou volbou.
Při jejich používání musíme být opatrní jako:
- Někdy mohou zpomalit běh kódu a spotřebovat více paměti.
- Mohou také snížit čitelnost kódu.
Nesmíme se snažit, aby se do nich vešla složitá logika nebo velké množství porozumění slovníku, jen aby byl kód jednotný. V těchto případech je lepší zvolit jiné alternativy, jako jsou smyčky.