Генераторы словарей. Другие интересные штуки, которые можно делать с помощью генераторов словарей. Генераторы множеств. Материалы для дальнейшего чтения
↑ Это не генератор словаря, это генератор списка. Он находит все файлы с расширением. py, проверяет их имена, а затем создает кортеж из имени файла и метаданных файла (вызывая функцию os. stat()).
↑ Каждый элемент результирующего списка — кортеж.
↑ Это генератор словаря. Синтаксис подобен синтаксису генератора списка, но с двумя отличиями. Во-первых, он заключён в фигурные скобки, а не в квадратные. Во-вторых, вместо одного выражения для каждого элемента он содержит два, разделённые двоеточием. Выражение слева от двоеточия (в нашем примере f) является ключом словаря; выражение справа от двоеточия (в нашем примере os. stat(f)) — значением.
↑ Генератор словаря возвращает словарь.
↑ Ключи данного словаря — это просто имена файлов, полученные с помощью glob. glob('*test*. py').
↑ Значение, связанное с каждым ключом, получено с помощью функции os. stat(). Это означает, что в этом словаре мы можем по имени файла получить его метаданные. Один из элементов метаданных (st_size) — это размер файла. Размер файла alphameticstest. py — 2509 байт.
Также, как и в генераторах списков, вы можете включать в генераторы словарей условие if, чтобы отфильтровать входную последовательность с помощью выражения-условия, вычисляющегося для каждого элемента.
> > > import os, glob, humansize
> > > metadata_dict = {f: os. stat(f) for f in glob. glob('*')}
[1]
> > > humansize_dict = {os. path. splitext(f)[0]: humansize. approximate_size(meta. st_size) \... for f, meta in metadata_dict. items() if meta. st_size > 6000}
↑ В этом выражении берётся список файлов в текущей директории (glob. glob('*')), для каждого файла определяются его метаданные (os. stat(f)) и строится словарь, ключами которого выступают имена файлов, а значениями — метаданные каждого файла.
↑ Этот генератор строится на основе предыдущего. Отфильтровываются файлы меньше 6000 байт (if meta. st_size > 6000). Отобранные элементы используются для построения словаря, ключами которого являются имена файлов без расширения (os. path. splitext(f)[0]), а значениями — приблизительный размер каждого файла (humansize. approximate_size(meta. st_size)).
↑ Как вам уже известно из предыдущего примера, всего имеется шесть таких файлов, следовательно, в этом словаре шесть элементов.
↑ Значение для каждого ключа представляется из себя строку, полученную вызовом функции approximate_size().
Другие интересные штуки, которые можно делать с помощью генераторов словарей
Вот трюк с генераторами словарей, который когда-нибудь может оказаться полезным: перестановка местами ключей и значений словаря.
> > > a_dict = {'a': 1, 'b': 2, 'c': 3} > > > {value: key for key, value in a_dict. items()} {1: 'a', 2: 'b', 3: 'c'}
Конечно же, это сработает, только если значения элементов словаря неизменяемы, как, например, строки или кортежи.
> > > a_dict = {'a': [1, 2, 3], 'b': 4, 'c': 5} > > > {value: key for key, value in a_dict. items()} Traceback (most recent call last): File " < stdin> ", line 1, in < module> File " < stdin> ", line 1, in < dictcomp> TypeError: unhashable type: 'list'
Генераторы множеств
Нельзя оставить за бортом и множества, они тоже могут создаваться с помощью генераторов. Единственное отличие — вместо пар ключ: значение, они строятся на основе одних значений.
> > > {x ** 2 for x in a_set} {0, 1, 4, 81, 64, 9, 16, 49, 25, 36}
[1]
> > > {x for x in a_set if x % 2 == 0} {0, 8, 2, 4, 6}
[2]
> > > {2**x for x in range(10)} {32, 1, 2, 4, 8, 64, 128, 256, 16, 512}
[3]
↑ В качестве входных данных генераторы множеств могут получать другие множества. Этот генератор рассчитывает квадраты множества чисел в диапазоне от 0 до 9.
↑ Подобно генераторам списков и словарей, генераторы множеств могут содержать условие if для проверки каждого элемента перед включением его в результирующее множество.
↑ На вход генераторы множеств могут принимать не только множества, но и любые другие последовательности.
Материалы для дальнейшего чтения
Модуль os
os — доступ к особым возможностям операционных систем
Модуль os. path
os. path — манипуляции с именами файлов, независимые от платформы