我可以在Python中将迭代器的内容“拼接”成我自己的迭代器吗?

2024-09-28 20:48:50 发布

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

假设我有一个迭代器,我想在它之前或之后添加一些元素。我能想到的唯一方法是使用显式循环:

def myiter(other_iter):
    yield "First element"
    for item in other_iter:
        yield item
    yield "Last element"

有没有更好或更有效的方法来做到这一点?有没有一个名为yield_items_from的函数可以这样使用?在

^{pr2}$

编辑:

好吧,我把我的例子简单化了。这里有一个更好的方法:

假设我有一个迭代器,它返回一个非负整数的升序序列。我想返回一个从零开始计数的迭代器,对于其他字节返回的数字返回1,否则返回0。例如,如果其他函数的结果是[1,4,5,7],我希望得到[0,1,0,0,1,1,0,1]。有没有一种有效且易读的方法来做到这一点?在


Tags: 方法函数in元素fordefitemselement
3条回答

要回答您的新问题:

other_iter = [1,4,5,7]

def flags( items ):
    c = 0
    for this in items:
        while c < this:
            yield 0
            c += 1
        yield 1

print list(flags(other_iter))

我很确定没有内置或助手可以做到这一点。在

不,没有什么能像yield_items_from,尽管有一个草案建议在PEP 380中向python3.X添加一个。在

对于当前的Python,显式循环是从子迭代器生成的唯一方法。不过,这是相当有效的,而且这是惯用的方法,所以你不应该被冗长的内容所困扰。在

如果您只需要在迭代器的前面或后面添加新项,那么您只需使用itertools.chain来创建一个新的迭代器。您可以使用它将多个迭代器链接在一起,或者通过将单个项包装在列表中来附加/前置单个项。在

new_iter = itertools.chain(['prefix item'], old_iter, appended_iter)

使用itertools.chain

import itertools

for item in itertools.chain(["First element"],other_iter,["Last element"]):
    ...

关于编辑后的问题,请回答:

^{pr2}$

相关问题 更多 >