Использование zip
вместе с itertools.repeat
и itertools.chain
.
>>> from itertools import chain, repeat
>>> fruits = ["banana", "apple", "mango", "kiwi"]
>>> list(chain.from_iterable(zip(fruits, repeat("peach"))))
['banana', 'peach', 'apple', 'peach', 'mango', 'peach', 'kiwi', 'peach']
repeat
создает бесконечную последовательность 'peach'
. zip
создает последовательность пар, состоящую из одного элемента из фруктов, за которым следует экземпляр 'peach'
. chain.from_iterable
«сводит» последовательность пар в одну последовательность, а list
создает конкретный список из последовательности.
Просмотр промежуточных шагов:
>>> from itertools import islice
>>> list(islice(repeat("peaches"), 5))
['peaches', 'peaches', 'peaches', 'peaches', 'peaches']
>>> zip(fruits, repeat("peaches"))
[('banana', 'peaches'), ('apple', 'peaches'), ('mango', 'peaches'), ('kiwi', 'peaches')]
Этот подход сводится к серии appends
к новому списку, что-то вроде
result = []
for x in fruits:
result.append(x)
result.append("peaches")
Но вместо жесткого кодирования аргументов append
, вы выбираете их из парыитераторов:
def peach_source():
while True:
yield "peach"
def fruit_source(fruits):
for x in fruits:
yield x
result = []
peaches = peach_source()
fruits = fruit_source(fruits) # Yes, this is highly redundant; just showing the similarity to peach_source
done = False
while not done:
try:
result.append(next(fruits))
except StopIteration:
done = True
result.append(next(peaches))
itertools.repeat
создает peach_source
для вас. zip
обрабатывать чередование между извлечением фруктов и персиком. chain.from_iterable
определяет действие добавления к result
, а list
фактически выполняет добавления.