Как написать генератор, который принимает список списков, и возвращает их плоское представление?

Написать генератор, который принимает список списков, и возвращает их плоское представление. Например:

nested_list = [
    ['a', 'b', 'c'],
    ['d', 'e', 'f'],
    [1, 2, None],
]
for item in  flat_generator(nested_list):
    print(item)

Ответы (4 шт):

Автор решения: ПИТОНИСТ версия-3-8

Вот так что-ли? Решение в лоб:

nested_list = [
    ['a', 'b', 'c'],
    ['d', 'e', 'f'],
    [1, 2, None],
]
for i in nested_list[:]:
    for x in i: nested_list.append(x)
    nested_list.remove(i)
print(nested_list)

Вывод:

['a', 'b', 'c', 'd', 'e', 'f', 1, 2, None]
→ Ссылка
Автор решения: strawdog

Для двумерного списка это просто:

nested_list = [
    ['a', 'b', 'c'],
    ['d', 'e', 'f'],
    [1, 2, None],
]

def flat_generator(a: list) -> list:
    return [x for sublist in a for x in sublist]

for item in  flat_generator(nested_list):
    print(item)
→ Ссылка
Автор решения: SergFSM

А что вы подразумеваете под генератором? Вот такое выражение по сути тоже генератор:

nested_list = [
    ['a', 'b', 'c'],
    ['d', 'e', 'f'],
    [1, 2, None]]

gen = (i for l in nested_list for i in l)
gen
'''
<generator object <genexpr> at 0x00000220017EA7B0>
'''
next(gen)
'''
'a'
'''
type(gen)
'''
generator

UPD

кстати такая функция тоже генератор:

def gen(nl):
    for l in nl: 
        for i in l:
            yield i

g = gen(nested_list)
g
'''
<generator object gen at 0x0000022001819740>
'''
next(g)
'''
'a'
'''
for i in g: print(i)
'''
a
b
c
d
e
f
1
2
None
→ Ссылка
Автор решения: Stanislav Volodarskiy

itertools.chain.from_iterable решает вашу задачу:

import itertools

for i in itertools.chain.from_iterable(nested_list):
    print(i)

Если вы не хотите пользоваться библиотекой, то подойдёт вложенный генератор:

for i in (i for lst in nested_list for i in lst):
    print(i)

Если вложенный генератор кажется слишком сложным, тогда вложенные циклы:

for lst in nested_list:
    for i in lst:
        print(i)
→ Ссылка