На этом шаге мы рассмотрим использование генератора словарей.
Вы хотите создать словарь, который будет подмножеством другого словаря.
Эту задачу можно легко решить с помощью генератора словаря (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 раза медленнее, чем первое. Если производительность для вас важна, обычно стоит потратить немного времени на изучение таких вопросов.
На следующем шаге мы рассмотрим отображение имен на последовательность элементов.