Python内联生成器

2024-04-20 15:22:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将一个值插入列表中

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'])显然有效,但我不会说它优雅


Tags: 方法函数true列表defmore代码段res
3条回答

^{}。我不知道interleave是如何实现的,但您可以对chainzip执行相同的操作:

from itertools import chain, repeat

print(list(chain.from_iterable(zip(repeat(1), ['A', 'B', 'C']))))
# [1, 'A', 1, 'B', 1, 'C']
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']

您还可以使用如下列表:

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']

相关问题 更多 >