Python встроенный генератор - PullRequest
1 голос
/ 05 марта 2020

Я пытаюсь вставить значение в список.

interleave(1, ['A', 'B', 'C']) -> [1, 'A', 1, 'B', 1, 'C']

Существует несколько способов решения этой проблемы, но я подумал, что more_itertools.interleave будет наиболее читаемый Однако для использования этой функции мне нужно создать генератор, который выдает 1 навсегда. Ясно, что это можно сделать с помощью

def gen1():
    while True:
        yield 1

, но это кажется более сложным, чем необходимо.

Существует ли элегантный способ заменить ... во фрагменте ниже, чтобы создать встроенный генератор такой, что

res = more_itertools.interleave(..., ['A', 'B', 'C'])
assert list(res) == [1, 'A', 1, 'B', 1, 'C']

... = (1 for _ in ['A', 'B', 'C']) явно работает, но я бы не назвал это элегантным.

Ответы [ 3 ]

3 голосов
/ 05 марта 2020

itertools.repeat. Я не знаю, как реализовано interleave, но вы можете сделать то же самое с chain и zip:

from itertools import chain, repeat

print(list(chain.from_iterable(zip(repeat(1), ['A', 'B', 'C']))))
# [1, 'A', 1, 'B', 1, 'C']
0 голосов
/ 05 марта 2020
def interleave(a,list1):
    newlist=[]
    for x in list1:newlist.extend([a,x])
    return newlist
print(interleave(1,['A','B','C']))

отпечатки

[1, 'A', 1, 'B', 1, 'C']
0 голосов
/ 05 марта 2020

Вы также можете использовать понимание списка следующим образом:

def interleave(value, lst):
    return [j for i in lst for j in (value, i)]

Так что interleave(1, ['A', 'B', 'C']) возвращает:

[1, 'A', 1, 'B', 1, 'C']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...