Можно ли изменить это выражение генератора, чтобы оно соответствовало результату цикла?
Рассмотрим это для цикла:
y = []
for z in ('a', 'b\nc', 'd'):
y.extend(z.splitlines())
Плоский список y
не получен аналогичным образом
y = []
y.extend(z.splitlines() for z in ('a', 'b\nc', 'd'))
Можно ли изменить выражение генератора, чтобы оно возвращало плоский список?
1 ответ
Решение
Вам нужен двойной цикл:
y.extend(v for z in ('a', 'b\nc', 'd') for v in z.splitlines())
Если y
начинается пусто, вы можете также сделать это понимание списка:
y = [v for z in ('a', 'b\nc', 'd') for v in z.splitlines()]
Вы также можете использовать itertools.chain.from_iterable()
:
from itertools import chain
y.extend(chain.from_iterable(z.splitlines() for z in ('a', 'b\nc', 'd')))
Демо-версия:
>>> from itertools import chain
>>> [v for z in ('a', 'b\nc', 'd') for v in z.splitlines()]
['a', 'b', 'c', 'd']
>>> y = []
>>> y.extend(v for z in ('a', 'b\nc', 'd') for v in z.splitlines())
>>> y
['a', 'b', 'c', 'd']
>>> y = []
>>> y.extend(chain.from_iterable(z.splitlines() for z in ('a', 'b\nc', 'd')))
>>> y
['a', 'b', 'c', 'd']