Как разделить один список на два по определённому признаку элементов? Самый очевидный способ выглядит так:
array = [1, 2, 3, 4, 5, 6, 7, 8, 9]
even, odd = [], []
for item in array:
if item%2:
odd.append(item)
else:
even.append(item)
Смотрим что получается
>>> odd
[1, 3, 5, 7, 9]
>>> even
[2, 4, 6, 8]
А теперь способ в одну строку!
(ну кто бы сомневался😂)
_ = [[even.append, odd.append][x%2](x) for x in array]
Я специально сохранил результат в переменную "_", так как этот результат нам не нужен. Вся магия происходит во время выполнения генератора списка.
Выражение x%2 возвращает нам 1 или 0, что является индексом списка [even.append, odd.append]. Таким образом происходит выбор метода append() для нужного списка и сразу после этого мы вызываем его, отправляя очередной элемент в выбранный список.
Точно так же в выражение можно ставить сравнение, которое вернёт bool. Ведь вы помните, что bool это производный тип от int, а значит True это 1 а False это 0.
>>> arr = [100, 200]
>>> print(arr[True])
200
>>> print(arr[False])
100
В нашем случае можно сделать так
more, less = [], []
[[less.append, more.append][x>5](x) for x in array]
Можно даже никуда не сохранять результат, всё равно то что нам нужно произойдет.
>>> print(more, less)
[6, 7, 8, 9], [1, 2, 3, 4, 5]
#tricks