о, мой милый: понимание списка
в питоне я доверяю — стих 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. Надеюсь, теперь вы верите, что это какой-то шикарный инструмент!