Генераторы списков, словарей и множеств. Списки (list)

Wi-fi 04.11.2020
Wi-fi

Представим себе ситуацию - вам необходимо извлечь все элементы списка и присвоить каждый из них своей определенной переменной. Например, у нас есть список описывающий человека и содержащий следующие элементы:

Person_data = ["John", "Smith", 23, "programmer"]

User_name, user_surname, user_age, user_occupation = person_data

После этого мы сможем использовать отдельно каждую созданную переменную.

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

Как пользоваться генераторами в Python.

Генераторами списков в Python называются однострочные конструкции, которые позволяют создавать новые списки.

Синтаксис генераторов списков такой:

# самый простой генератор new_list =

В итоге new_list будет содержать числа от 0 до 9. Понятно, что для того чтобы создать такой список незачем пользоваться генератором. Достаточно просто воспользоваться функцией range()

# пример посложнее word = "hello" new_list =

Теперь new_list будет выглядеть так:

["h","e","l","l","o"]

Так же в генераторы списков можно вставлять конструкцию if:

# Создаем список из чисел кратных трем new_list =

В итоге получим:

Наконец, в генераторе можно использовать несколько списков и переменных:

# создание колоды карт при помощи генератора списков # масти suits = "HDCS" # ранги ranks = "23456789TJQKA" # генерируем колоду deck =

Получим следующий результат:

Представьте, сколько времени мы сэкономили, написав всего одну строчку вместо нескольких циклов .

Как извлечь элементы из подсписков в Python.

Так же, часто возникает ситуация, когда необходимо извлечь элементы из подспиков списка.

Например имеем такой список:

Outer = [, , ]

Задача создать отдельный список содержащий все элементы подсписков данного списка. Выполнить эту задачу можно при помощи все того же генератора списков:

New_list =

Таким образом получаем список со всеми элементами:

На этом на сегодня все. Удачи в освоении Python !

У языка программирования Pyrhon есть особая синтаксическая конструкция, с помощью которой можно на основании определенных правил создавать заполненные списки. Формируемые списки могут получаться различными, содержание конструкции может быть разным, поэтому они получили название генераторы списков. Они удобны, потому что записи получаются не такими длинными, нежели при традиционном методе создания списков.

К примеру, нужен список из натуральных чисел до конкретного числа. Традиционный метод будет иметь такой вид:

>>> a = >>> for i in range(1,15): ... a.append(i) ... >>>

Список занял три строчки кода. А генератору нужна только одна:

>>> a = >>> a

Конструкция – это генератор списка. Всю конструкции нужно поместить в квадратные списки, что отражает создание списка. Внутри скобок есть три части:

  1. Что будем делать с элементов (в нашей ситуации не делаем ничего, просто вносим в перечень).
  2. Что будем брать (мы берем элемент i).
  3. Откуда будем брать (из объекта range). Для отделения частей используем ключевые слова in и for.

Разберем на примере

>>> a = >>> b = >>> b

В этой ситуации мы берем каждый элемент перечня и возводим в квадрат. Отсюда:

  1. Делаем – возводим наш элемент в квадрат.
  2. Берем – элемент.
  3. Откуда – из перечня а.
>>> a = {1:10, 2:20, 3:30} >>> b = for i in a] >>> b

Тут берем ключ в словаре, а в генерируемый список попадает произведение ключа на имеющееся у него значение.

>>> a = {1:10, 2:20, 3:30} >>> b = [] for i in a] >>> b [, , ] >>> c = >>> c

В данном случае список b содержит вложенные списки. Опустив в генераторе квадратные скобы по выражению ] была бы получена ошибка. Если вам нужен одноуровневый перечень с ключами из словарных значений, нужно взять каждый вложенный перечень и уже оттуда брать каждый компонент. Делается это вложенной конструкцией for. Традиционный синтаксис формирования перечня имеет такой вид:

>>> c = >>> for i in b: ... for j in i: ... c.append(j) ... >>> c

Генераторы списков могут дополняться конструкцией if. К примеру, нужно извлечь все числа из строки:

>>> a = "lsj94ksd231 9" >>> b =

Либо наполнить список цифрами, кратными 31 или 30:

>>> a = >>> a

Перечни так создаваться намного проще и быстрее. Но, они не годятся для замены достаточно сложных конструкций. К примеру, если в условии проверки будет ветка else.

Закончились деньги, а до зарплаты еще пара недель? Можно одолжить, но что делать если не у кого? Не идти же в банк за кредитом. В этом случае вам помогут микрозаймы . Простой зайдите на сайт, оформите заявку (это очень просто и быстро) и через несколько минут вы получите деньги! Очень удобно и быстро, и главное не нужно ни у кого просить!

В языке программирования Python существует специальная синтаксическая конструкция, которая позволяет по определенным правилам создавать заполненные списки. Такие конструкции называются генераторами списков . Их удобство заключается в более короткой записи программного кода, чем если бы создавался список обычным способом.

Например, надо создать список, заполненный натуральными числами до определенного числа. "Классический" способ будет выглядеть примерно так:

>>> a = >>> for i in range (1 , 15 ) : ... a.append (i) ... >>> a

На создание списка ушло три строчки кода. Генератор же сделает это за одну:

>>> a = [ i for i in range (1 , 15 ) ] >>> a

Здесь конструкция [ i for i in range (1 , 15 ) ] является генератором списка. Вся конструкция заключается в квадратные скобки, что как бы говорит, что будет создан список. Внутри квадратных скобок можно выделить три части: 1) что делаем с элементом (в данном случае ничего не делаем, просто добавляем в список), 2) что берем (в данном случае элемент i), 3) откуда берем (здесь из объекта range). Части отделены друг от друга ключевыми словами for и in .

Рассмотрим такой пример:

>>> a = [ 2 , -2 , 4 , -4 , 7 , 5 ] >>> b = [ i**2 for i in a] >>> b

В данном случае в генераторе списка берется каждый элемент из списка a и возводится в квадрат. Таким образом, 1) что делаем - возводим элемент в квадрат, 2) что берем - элемент, 3) откуда берем - из списка a .

>>> >>> b = [ i*a[ i] for i in a] >>> b

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

>>> a = { 1 :10 , 2 :20 , 3 :30 } >>> b = [ [ i, a[ i] ] for i in a] >>> b [, , ] >>> c = [ j for i in b for j in i] >>> c

В этом примере генерируемый список b состоит из вложенных списков. Если бы в генераторе были опущены квадратные скобки в выражении [ i, a[ i] ] , то произошла бы ошибка. Если все же надо получить одноуровневый список из ключей и значений словаря, надо взять каждый вложенный список и из него взять каждый элемент. Это достигается за счет вложенной конструкции for , что демонстрируется в строчке c = [ j for i in b for j in i] . "Классический" синтаксис для заполнения списка c выглядел бы так:

>>> c = >>> for i in b: ... for j in i: ... c.append (j) ... >>> c

В конец генератора можно добавлять конструкцию if . Например, надо из строки извлечь все цифры:) if i%30 == 0 or i%31 == 0 ] >>> a

Таким образом, генераторы позволяют создавать списки легче и быстрее. Однако заменить ими достаточно сложные конструкции не получится. Например, когда условие проверки должно включать ветку else .

| |

Генераторы списков (list comprehensions) позволяют быстро создать список на основе существующих списков. При помощи генератора можно построить список на основе любого итерируемого типа данных (к примеру, из строк или кортежей).

В результате цикл создаст такой же список:

["8", "h", "o", "s", "t"]

Условные выражения в генераторах списков

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

Давайте рассмотрим генератор с выражением if:

fish_tuple = ("blowfish", "clownfish", "catfish", "octopus")
fish_list =
print(fish_list)

Список использует кортеж fish_tuple в качестве основы для нового списка fish_list.

Ключевые слова for и in используются так же, как в предыдущем размере. Кроме того, генератор содержит выражение if, благодаря чему он исключает из списка строку ‘octopus’.

Запросите содержимое списка fish_list и убедитесь, что он содержит все элементы fish_tuple, кроме ‘octopus’.

["blowfish", "clownfish", "catfish"]

Как видите, с помощью условного выражения можно исключить из нового списка определённый элемент.

Теперь рассмотрим другой пример, в котором используются математические операции, цифры и метод range().


print(number_list)

Читайте также:

Новый список number_list будет содержать квадратичные значения каждого чётного элемента в диапазоне от 0-9. В результате получится такой список:

Давайте разберём этот пример пошагово. Если вместо x ** 2 for x использовать просто x for x, список будет выглядеть так:

number_list =
print(number_list)

После этого в генератор было добавлено условное выражение:

number_list =
print(number_list)

Выражение if исключило из списка все нечётные числа.

Теперь осталось добавить оператор, который возведёт все элементы в квадрат:

number_list =
print(number_list)

Теперь каждый элемент списка будет возведён в квадрат.

Также в генераторах можно использовать вложенные выражения if:

number_list =
print(number_list)

Генератор списков - это уже известные нам конструкции в новой "обертке". Внешне, они построены, в простейшей своей форме, на цикле "for" и призваны решать тотже спектр задач, что и классический цикл "for". Впринципе, нет такой задачи, которую можно выполнить через генератор списков и нельзя было бы выполнить через классический цикл "for", но сама структура генератора является краткой, лаконичной и гибкой в использовании. Держите в памяти то, что базой для генератора, служит цикл "for" и все, что мы выполняем при помощи этого цикла, мы можем выполнять и в генераторе. Рассмотрим простейший синтаксис генератора списка:

>>> lst =
>>> lst

>>>

>>>

Посмотрим на код более внимательно. ВНачале был создан список чисел "1,2,3,4,5", после чего следует форма записи генератора. Запись генератора списков береться в квадратные скобки. Вначале указывается действие для переменной, куда цикл помещает элементы на каждом шаге итерации, зачем следует классическая форма записи объявления цикла "for", куда передается созданный список чисел. Генератор списка возвращает список чисел, которые были сгенерированы в процессе указанного действия внутри генератора, а именно, взять элемент на каждом шаге итерации и умножить его на 2. Врезультате чего, получаем список чисел из списка "lst", Где каждый элемент умножен на 2. При использовании классического цикла "for", эта запись выглядит следующим образом:

>>> lst =
>>> lst

>>> lst2 =
>>> for i in lst:
... lst2.append(i*2)
...
>>> lst2

>>>

Согласитесь, запись в виде генератора списка, была куда более краткой. На первый взгляд, приемущества генератора списков очевидны далеко не сразу, но давайте смоделируем несколько ситуаций, где мы можем применить генератор списка, который позволит сократить количество написанного кода, а главное, позволит сократить код не в ущерб производительности и сопровождению. Кпримеру, у нас есть файл, с которого нам необходимо достать список строк. Файл находится в кодировке "utf-8" и в процессе доставания, нам необходимо декодировать строки в юникод, параллельно убрав эскейп последовательность "\n", в конце каждой строки.

>>> text = for s in open(ur"d:\dev\price.txt")]
>>> print text

>>>

Полюбуйтесь на этот код! Мы выполнили поставленную задачу в одну строку кода. Впринципе, код достаточно очевидный. Мы обратились к файлу непосредственно в цикле "for", что передало циклу объект-итератор файла. Далее цикл пробежался по строкам, и выполнил действие, которое мы указали ему вначале нашего генератора, Т.Е. Перевел каждую строку в юникод и вернул ее со срезом [:-1], что позволило удалить эскейп последовательность "\n". Собственно получившийся список, мы присвоили переменной "text", которая и содержит список обработанных строк:

>>> for i in text:
... print i
...
Прайс на чебурашек, чубурашек и чибураторов.




Чубурашка, цвет синий, характер мерзкий, цена 200 грн;
Чубурашка, цвет голубой, характер доставучий, цена 250 грн;
Чубурашка, цвет малиновый, характер клубничный, цена 300 грн;
Чибуратор, цвет хаки, характер нордический, цена 400 грн;
Чибуратор, цвет мутный, характер мутный, цена 400 грн;
Чибуратор, цвет шоколадный, характер мармеладный, цена 500 грн;
Чибуратор, цвет полосатый, характер сонный, цена 600 грн;
>>>

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

Генератор списков с условием "if"

Мы можем сделать генератор списков еще более гибким, использовав в его конструкции условие "if". Для демонстрации, решим простую задачу. Из списка чисел, нам необходимо сформировать новый список чисел, которые будут больше или равны пяти:

>>> lst =
>>> lst

>>>

>>>

Мы расширили синтаксис генератора списков условием "if", которое имеет выражение ">= 5". Генератор вернет список только тех значений, которые будут обрабатываться на шаге итерации, при котором "if" будет получать "True". Соответственно, нам вернется список чисел, которые соответствуют утверждению ">= 5".
Мы можем еще более расширить генератор списка, воспользовавшись тернарной записью "if else":

>>> 1 if 3>2 else 0
1
>>> 1 if 3 < 2 else 0
0
>>>

Напомню, что тернарная запись "if else", возвращает результат слева, если выражение после "if", возвращает "True". В противном случае, возвращается результат справа. Теперь посмотрим, как мы можем соединить это с генератором списка, решив предыдущую задачу, но поставив условие, что, как только нам встречается число в списке меньше пяти, мы возвращаем его, но прибавив к нему +5:

>>> lst

>>>

>>>

Давайте решим еще одну, менее синтетическую задачу, на основании этого синтаксиса. Возьмем нашь файлик "price.txt" и вернем в список только те строки, которые начинаются со слова "Чебурашка", а для остальных результатов, вернуть "None":

>>> text = for string in open(ur"d:\dev\price.txt")]
>>> for i in text:
... print i
...
None
Чебурашка, цвет зеленый, характер унылый, цена 100 грн;
Чебурашка, цвет красный, характер агрессивный, цена 150 грн;
Чебурашка, цвет коричневый, характер чебурашечный, цена 150 грн;
Чебурашка, цвет белый, характер настырный, цена 200 грн;
None
None
None
None
None
None
None
>>>

(Строчный метод "startswith", возвращает "True", если строка начинается с переданного в метод префикса)

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

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

>>> lst

>>> {i:i*2 for i in lst}
{1: 2, 2: 4, 3: 6, 4: 8, 5: 10}
>>>

Все выражение генератора мы заключаем в фигурные скобочки, а в начале, в виде действия, указываем синтаксис записи пары "ключ/значение" для словаря.

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

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

>>> lst =
>>> lst

>>> {i*2 for i in lst}
set()
>>>

Будте внимательны, генератор множеств, также, как и генератор словарей, заключается в фигурные скобочки, разница лишь в синтаксисе. Для генератора множеств, мы не указываем вид пары "ключ/значение", его синтаксис схож с генератором списков, но заключен в фигурные скобочки. Именно такой синтаксис, говорит Python, что это генератор множеств.

Рекомендуем почитать

Наверх