Как написать генератор, который принимает список списков, и возвращает их плоское представление?
Написать генератор, который принимает список списков, и возвращает их плоское представление. Например:
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)