Можно ли изменить это выражение генератора, чтобы оно соответствовало результату цикла?

Рассмотрим это для цикла:

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']
Другие вопросы по тегам