Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Генераторы словарей. Другие интересные штуки, которые можно делать с помощью генераторов словарей. Генераторы множеств. Материалы для дальнейшего чтения




Генераторы словарей

Генератор словаря похож на генератор списка, но вместо списка он создает словарь.

> > > import os, glob
> > > metadata = [(f, os. stat(f)) for f in glob. glob('*test*. py')] [1]
> > > metadata[0] ('alphameticstest. py', nt. stat_result(st_mode=33206, st_ino=0, st_dev=0, st_nlink=0, st_uid=0, st_gid=0, st_size=2509, st_atime=1247520344, st_mtime=1247520344, st_ctime=1247520344)) [2]
> > > metadata_dict = {f: os. stat(f) for f in glob. glob('*test*. py')} [3]
> > > type(metadata_dict) < class 'dict'> [4]
> > > list(metadata_dict. keys()) ['romantest8. py', 'pluraltest1. py', 'pluraltest2. py', 'pluraltest5. py', 'pluraltest6. py', 'romantest7. py', 'romantest10. py', 'romantest4. py', 'romantest9. py', 'pluraltest3. py', 'romantest1. py', 'romantest2. py', 'romantest3. py', 'romantest5. py', 'romantest6. py', 'alphameticstest. py', 'pluraltest4. py'] [5]
> > > metadata_dict['alphameticstest. py']. st_size 2509 [6]
  1. ↑ Это не генератор словаря, это генератор списка. Он находит все файлы с расширением. py, проверяет их имена, а затем создает кортеж из имени файла и метаданных файла (вызывая функцию os. stat()).
  2. ↑ Каждый элемент результирующего списка — кортеж.
  3. ↑ Это генератор словаря. Синтаксис подобен синтаксису генератора списка, но с двумя отличиями. Во-первых, он заключён в фигурные скобки, а не в квадратные. Во-вторых, вместо одного выражения для каждого элемента он содержит два, разделённые двоеточием. Выражение слева от двоеточия (в нашем примере f) является ключом словаря; выражение справа от двоеточия (в нашем примере os. stat(f)) — значением.
  4. ↑ Генератор словаря возвращает словарь.
  5. ↑ Ключи данного словаря — это просто имена файлов, полученные с помощью glob. glob('*test*. py').
  6. ↑ Значение, связанное с каждым ключом, получено с помощью функции 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} [2]
> > > list(humansize_dict. keys()) ['romantest9', 'romantest8', 'romantest7', 'romantest6', 'romantest10', 'pluraltest6'] [3]
> > > humansize_dict['romantest9'] '6. 5 KiB' [4]
  1. ↑ В этом выражении берётся список файлов в текущей директории (glob. glob('*')), для каждого файла определяются его метаданные (os. stat(f)) и строится словарь, ключами которого выступают имена файлов, а значениями — метаданные каждого файла.
  2. ↑ Этот генератор строится на основе предыдущего. Отфильтровываются файлы меньше 6000 байт (if meta. st_size > 6000). Отобранные элементы используются для построения словаря, ключами которого являются имена файлов без расширения (os. path. splitext(f)[0]), а значениями — приблизительный размер каждого файла (humansize. approximate_size(meta. st_size)).
  3. ↑ Как вам уже известно из предыдущего примера, всего имеется шесть таких файлов, следовательно, в этом словаре шесть элементов.
  4. ↑ Значение для каждого ключа представляется из себя строку, полученную вызовом функции 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'

Генераторы множеств

Нельзя оставить за бортом и множества, они тоже могут создаваться с помощью генераторов. Единственное отличие — вместо пар ключ: значение, они строятся на основе одних значений.

> > > a_set = set(range(10)) > > > a_set {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
> > > {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]
  1. ↑ В качестве входных данных генераторы множеств могут получать другие множества. Этот генератор рассчитывает квадраты множества чисел в диапазоне от 0 до 9.
  2. ↑ Подобно генераторам списков и словарей, генераторы множеств могут содержать условие if для проверки каждого элемента перед включением его в результирующее множество.
  3. ↑ На вход генераторы множеств могут принимать не только множества, но и любые другие последовательности.

Материалы для дальнейшего чтения

  • Модуль os
  • os — доступ к особым возможностям операционных систем
  • Модуль os. path
  • os. path — манипуляции с именами файлов, независимые от платформы
  • Модуль glob
  • glob — сравнение имён файлов с шаблонами
  • Модуль time
  • time — Функции для манипулирования временем
  • Генераторы списков
  • Вложенные генераторы списков
  • Техника циклов
Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...