о, мой милый: понимание списка

в питоне я доверяю — стих 4

понимание списка

какое-то шикарное дерьмо

сделать код меньше

это называется пилинг

в питоне я доверяю

в питоне я доверяю

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

источник: https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions

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

Список из списка

Возьмем пример создания списка из другого списка. Допустим, мы хотим возвести в квадрат все элементы. Это можно легко сделать, как я показываю здесь в своем посте о лямбде, используя метод карты. Давайте сделаем это, используя понимание списка.

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

[выражение for_loop]

выражение в данном случае равно x*x, а цикл for выполняется по элементам.

Теперь добавим в него условие. Давайте возведем элемент элементов в квадрат только в том случае, если это четное число.

Теперь формат понимания списка следующий:

[выражение for_loop условие]

Хотя это еще не конец. У нас может быть несколько циклов в понимании списка. Посмотрите на приведенный ниже код: понимание списка — это одна строка кода по сравнению с несколькими строками без него.

>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
equivalent to:
>>> combs = []
>>> for x in [1,2,3]:
...     for y in [3,1,4]:
...         if x != y:
...             combs.append((x, y))
...
>>> combs
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
Source: https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions

[условие выражения nested_for_loops]

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

items = [1, 2, 3]
comb = [(y, x) for y in range(1, x) for x in items  if x != y]
print(comb)

Приведенный выше код завершается с ошибкой:

Traceback (most recent call last):
  File "/Users/salil/Development/PythonPlayground/song.py", line 32, in <module>
    comb = [(y, x)  for y in range(1, x) for x in items  if x != y]
NameError: name 'x' is not defined

Причина в том, что сначала для y в диапазоне (1, x)выполняется, а x не определен в этой точке.

Приведенный выше код следует тому же порядку циклов for, если бы вы делали это без понимания списка. Код выдает тот же результат, что и комбинации из itertools. Надеюсь, теперь вы верите, что это какой-то шикарный инструмент!