15 апреля 2013 г.

Понимание генераторов множеств и словарей

Сейчас 2 часа  ночи, я ничего не понимаю, что относится к программированию на Python, но пишу этот пост... надеюсь кому то он поможет.


>>> {x * x for x in range(10)}         # Генератор
{0, 1, 4, 81, 64, 9, 16, 49, 25, 36}

>>> set(x * x for x in range(10)) # Генератор и конструктор типа
{0, 1, 4, 81, 64, 9, 16, 49, 25, 36}

>>> {x: x * x for x in range(10)}
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}

>>> dict((x, x * x) for x in range(10))
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}



Мы всегда можем конструировать объекты результата вручную.

Ниже приведется реализация, эквивалентна двум последним генераторам:

>>> res = set()
>>> for x in range(10):  # Эквивалент генератора множеств
...     res.add(x * x)
...
>>> res
{0, 1, 4, 81, 64, 9, 16, 49, 25, 36}
-------------------------------------
>>> res = {}

>>> for x in range(10):  # Эквивалент генератора словарей
...     res[x] = x * x
...
>>> res
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}

Если вам потребуется воспроизводить ключи и значения по запросу, 
используйте выражение-генератор:
>>> G = ((x, x * x) for x in range(10))
>>> next(G)
(0, 0)
>>> next(G)
(1, 1)


Расширенный синтаксис генераторов множеств и словарей

Как  и  генераторы  списков,  генераторы  множеств и  словарей  поддерживают
инструкции if, позволяющие  отфильтровывать элемен
ты, – следующие конструкции воспроизводят квадраты четных 
чисел (то есть чисел, которые делятся на 2 без остатка) в заданном диапазоне:


>>> [x * x for x in range(10) if x % 2 == 0] # Списки упорядочены
[0, 4, 16, 36, 64]

>>> {x * x for x in range(10) if x % 2 == 0} # А множества - нет
{0, 16, 4, 64, 36}

>>> {x: x * x for x in range(10) if x % 2 == 0}# Как и ключи
                                               # словаря
{0: 0, 8: 64, 2: 4, 4: 16, 6: 36}


Вложенные циклы for также являются допустимыми, хотя неупорядоченные типы данных, не допускают появления дубликатов, может несколько осложнять интерпретацию результатов:
>>> [x + y for x in [1, 2, 3] for y in [4, 5, 6]] # Списки сохраняют дубликаты
[5, 6, 7, 6, 7, 8, 7, 8, 9]

>>> {x + y for x in [1, 2, 3] for y in [4, 5, 6]} # А множества - нет
{8, 9, 5, 6, 7}

>>> {x: y for x in [1, 2, 3] for y in [4, 5, 6]} # Как и ключи словарей
{1: 6, 2: 6, 3: 6}


Подобно генераторам списков, генераторы множеств и словарей способны выполнять итерации по итераторам любых типов – спискам, строкам, файлам,диапазонам целых чисел и любым другим объектам, поддерживающим протокол итераций:
>>> {x + y for x in ‘ab’ for y in ‘cd’}
{‘bd’, ‘ac’, ‘ad’, ‘bc’}

>>> {x + y: (ord(x), ord(y)) for x in ‘ab’ for y in ‘cd’}
{‘bd’: (98, 100), ‘ac’: (97, 99), ‘ad’: (97, 100), ‘bc’: (98, 99)}

>>> {k * 2 for k in [‘spam’, ‘ham’, ‘sausage’] if k[0] == ‘s’}
{‘sausagesausage’, ‘spamspam’}

>>> {k.upper(): k * 2 for k in [‘spam’, ‘ham’, ‘sausage’] if k[0] == ‘s’}
{‘SAUSAGE’: ‘sausagesausage’, ‘SPAM’: ‘spamspam’}



Немного ключевых слов, если ты не бот для индексации тогда читать не обязательно!!!

Программирование, программирование на Python, Python, Python3.0, Python3, Python3.x, Python3.1, Python3.2, Python3.3, Python 3.x, Python, Python 3.0, Python 3, Python 3.1, Python 3.2, Python 3.3, Python 3.3.1












1 комментарий:

  1. >>> {x: y for x in [1, 2, 3] for y in [4, 5, 6]} # Как и ключи словарей
    {1: 6, 2: 6, 3: 6}

    по ошибке пробовал создать словарь этим методом. Создает, но каждому ключу присваивает последнее значение из второго списка.

    ОтветитьУдалить