Python, конструктор списков.

В питоне очень часто используются списки. Для этого в нем даже имеется специальная сокращенная синтаксическая форма порождения списков.

Введение

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

1 new_list = []
2 for i in range(2,5):
3     new_list.append(i**2)

Этим кодом будет создан список, включающий в себя квадраты чисел от 2 до 5: [4, 9, 16]

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

Конструктор списков, простейшая форма

[expression for var in list_expr]

Как это работает:

  • list_expr - любое выражение, возвращающее список
  • for var in list_expr - это цикл, который поочередно присваивает переменной var значения элементов списка, возвращенного list_expr
  • expression - выражение, в которое подставляется значение var
  • В результате все вместе возвращает список, элементами которого являются значения, вычисленные как результаты expression от элементов списка, которые возвращает list_expr

Простой пример:

>>> [x**2 for x in [1,2,3,4]]
[1, 4, 9, 16]

Пример с функцией возвращающей список:

>>> [x**2 for x in range(2,6)]
[4, 9, 16, 25]

Конструктор списков, более сложная форма

[expression for_expr_1 for_expr_2]
где:
for_expr_1 - выражение для одной переменной, напр var1
for_expr_2- выражение для другой переменной, напр var2

Выражение вернет список с элементами, которые будут результатом вычисления expression, которое будет вычисляться для с подстановкой значений var1 и var2. Причем для каждого значения var1 будут подставлены все значения переменной var2.

Таким образом длина выходного списка будет равна произведению длин списков выражений for_expr_1 и for_expr_2.

Пример:

[x+y for x in [1,2] for y in [100,200]]
[101, 201, 102, 202]

Выражений for может быть и больше двух.

Конструктор списков с фильтром

[expression expr_for filter_expr]

Работает так же, как и простейшая форма, кроме того, что добавляется фильтр, который представляет собой выражение, возвращающее True/False. В фильтр подставляется то же значение переменной, что и в выражение expression. Если значение True, вычисленное выражение вставляется в выходной список, если False, не вставляется.

Пример:

[x for x in range(1,10) if x%2 == 0]
[2, 4, 6, 8]

Получили список четных чисел в интервале от 1 до 10.

Естественно, фильтр можно использовать и в более сложной форме записи конструктора списков

Заключение

Вот примерно так.

Использованные термины

АнглийскийРусскийПроизношение
List ComprehensionsКонструктор списковлИст компрехЕншенс

Литература:

Опубликовано: June 15, 2012

Комментарии:


Имя: Alex

Спс, полезно!



Имя: Nick

thank you! It was helpful'



Комментировать:

Имя:

Комментарий: