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)#tricks
[6, 7, 8, 9], [1, 2, 3, 4, 5]