все Python 3Итераторы и генераторыпонятие
itertools.chain
itertools
Последовательно перебирает несколько итерируемых как одно целое.
Синтаксис
from itertools import chain
chain(a, b, c)
В отличие от a + b, chain ничего не копирует: элементы берутся по одному по мере обхода, память постоянная, и это работает с любыми итерируемыми — множествами, файлами, генераторами, а не только со списками одного типа. Разница между chain(*matrix) и chain.from_iterable(matrix) существенна: звёздочка сразу разворачивает внешнюю последовательность в аргументы, from_iterable берёт её лениво и потому переживает длинные или бесконечные внешние источники. Итог — обычный одноразовый итератор, второго прохода по нему не будет.
Примеры
from itertools import chain
result = list(chain([1,2],[3,4],[5,6]))
print(result) # → [1,2,3,4,5,6]
from itertools import chain
# chain.from_iterable
matrix = [[1,2],[3,4],[5,6]]
flat = list(chain.from_iterable(matrix))
print(flat) # → [1,2,3,4,5,6]
from itertools import chain
# Объединение строк
words = list(chain('hello', ' ', 'world'))
print(''.join(words)) # → hello world
from itertools import chain
# С генераторами
def gen1(): yield 1; yield 2
def gen2(): yield 3; yield 4
print(list(chain(gen1(), gen2()))) # → [1,2,3,4]
from itertools import chain
# chain vs list + list
a = range(1000000); b = range(1000000)
from itertools import chain
# chain(a,b) — без создания списка в памяти!
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности