Шаг 18.
Python: сборник рецептов.
Структуры данных и алгоритмы. Извлечение подмножества из словаря

    На этом шаге мы рассмотрим использование генератора словарей.

Задача

    Вы хотите создать словарь, который будет подмножеством другого словаря.

Решение

    Эту задачу можно легко решить с помощью генератора словаря (dictionary comprehension). Например:

>>> prices = {
	'ACME': 45.23,
	'AAPL': 612.78,
	'IBM': 205.55,
	'HPQ': 37.20,
	'FB': 10.75
	}
>>> # Создать словарь всех акций с ценами больше 200
>>> p1 = {key:value for key, value in prices.items() if value > 200}
>>> # Создать словарь акций технологических компаний
>>> tech_names = {'AAPL', 'IBM', 'HPQ', 'MSFT'}
>>> p2 = {key:value for key,value in prices.items() if key in tech_names}
>>> p1
{'AAPL': 612.78, 'IBM': 205.55}
>>> p2
{'AAPL': 612.78, 'IBM': 205.55, 'HPQ': 37.2}
>>> 


Обсуждение

    Большую часть того, что можно сделать с помощью генераторов словарей, можно осуществить путем создания последовательности кортежей и передачи их в функцию dict(). Например:

>>> p1 = dict((key, value) for key, value in prices.items() if value > 200)
>>> p1
{'AAPL': 612.78, 'IBM': 205.55}
>>> 

    Однако решение на основе генератора словаря яснее и работает немного быстрее (в рассмотренном выше примере генератор отработал в два раза быстрее).

    Иногда существует множество путей решить задачу. К слову, второй пример можно переписать так:

>>> #  Создать словарь акций технологических компаний
>>> tech_names = {'AAPL', 'IBM', 'HPQ', 'MSFT'}
>>> p2 = {key:prices[key] for key in prices.keys() & tech_names}
>>> p2
{'HPQ': 37.2, 'AAPL': 612.78, 'IBM': 205.55}
>>>

    Однако подсчет времени выполнения открывает нам, что это решение почти в 1,6 раза медленнее, чем первое. Если производительность для вас важна, обычно стоит потратить немного времени на изучение таких вопросов.

    На следующем шаге мы рассмотрим отображение имен на последовательность элементов.




Предыдущий шаг Содержание Следующий шаг