Абстракция словаря Python
Введение | |
Синтаксис | |
Пример | |
Влияние уникальности ключей | |
Словарь из списка | |
Фильтрация с помощью if | |
Похожие статьи |
Введение
Dict Comprehension - Абстракция словарей.
Похоже на List Comprehension но создаёт не список а словарь.
Базовый синтаксис
Вместо того, чтобы создавать пустой словарь и добавлять каждый элемент в конец, вы просто определяете словарь и его содержимое одновременно, следуя этому формату:
new_dict = {key_expression: value_expression for member in iterable}
{ key_expr(item): value_expr(item) for item in iterable }
Нужно помнить, о том, что
перебор значений
в словарях отличается от перебора в
списках
.
Для применения Dict Comprehension подходит использование метода
items()
Пример
Создадим словарь вида страна-столица и переделаем его в столица-страна с помощью Dict Comprehension
country_to_capital = { "Armenia": "Yerevan", "Finland": "Helsinki", "Germany": "Berlin", "Sweden": "Stockholm" } capital_to_country = {capital: country for country, capital in country_to_capital.items()} from pprint import pprint as pp pp(capital_to_country)
python dict_compreh.py
{'Berlin': 'Germany', 'Helsinki': 'Finland', 'Stockholm': 'Sweden', 'Yerevan': 'Armenia'}
Влияние уникальности ключей
Так как ключи должны быть уникальными, при использовании Dict Comprehensions могут образоваться совпадения, из которых уцелеют только самые последние.
Создадим словарь из списка стран. В качестве ключа будем использовать первую букву названия страны
countries = ["Armenia", "Austria", "Germany", "Georgia"] a = {c[0]: c for c in countries} print(a)
python dict_compreh.py
{'A': 'Austria', 'G': 'Georgia'}
Армения и Германия не попали в список, потому что их ключи "A" и "G" были перезаписаны аналогичными ключами от Австрии и Грузии.
Сложность
Можно создавать абстракции словарей любой сложности, но желательно ограничиваться такими, которые удобно читать.
import os import glob from pprint import pprint as pp file_sizes = {os.path.realpath(p): os.stat(p).st_size for p in glob.glob('*.py')} pp(file_sizes)
python dict_compreh.py
{'/home/andrei/dict_compreh.py': 283, '/home/andrei/subprocess_ex.py': 102, '/home/pydantic_ex.py': 155}
Фильтрация с помощью if
При использовании Dict Comprehension можно применять условия для выбора нужных объектов.
from math import sqrt from pprint import pprint as pp def is_prime(x): if x < 2: return False for i in range(2, int(sqrt(x)) + 1): if x % i == 0: return False return True prime_square_divisors = {x*x: (1, x, x*x) for x in range(20) if is_prime(x)} pp(prime_square_divisors)
python filtering_compreh.py
{4: (1, 2, 4), 9: (1, 3, 9), 25: (1, 5, 25), 49: (1, 7, 49), 121: (1, 11, 121), 169: (1, 13, 169), 289: (1, 17, 289), 361: (1, 19, 361)}
РЕКЛАМА от Яндекса. Может быть недоступна в вашем регионе
Конец рекламы. Если там пусто считайте это рекламой моей телеги