如何合并两个python迭代器?

2024-05-23 22:18:59 发布

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

我有两个迭代器,一个list和一个itertools.count对象(即无限值生成器)。我想将这两个合并到一个结果迭代器中,该迭代器将在两个迭代器之间交替产生值:

>>> import itertools
>>> c = itertools.count(1)
>>> items = ['foo', 'bar']
>>> merged = imerge(items, c)  # the mythical "imerge"
>>> merged.next()
'foo'
>>> merged.next()
1
>>> merged.next()
'bar'
>>> merged.next()
2
>>> merged.next()
Traceback (most recent call last):
    ...
StopIteration

最简单、最简洁的方法是什么?


Tags: the对象importmostfoocountbaritems
3条回答

我也同意不需要itertools。

但为什么停在2点?

  def tmerge(*iterators):
    for values in zip(*iterators):
      for value in values:
        yield value

处理从0到上的任意数量的迭代器。

更新:DOH!一位评论人士指出,除非所有迭代器的长度都相同,否则这是行不通的。

正确的代码是:

def tmerge(*iterators):
  empty = {}
  for values in itertools.izip_longest(*iterators, fillvalue=empty):
    for value in values:
      if value is not empty:
        yield value

是的,我只是用了不等长的列表和一个包含{}的列表。

你可以做一些@Pramod最初建议的事情。

def izipmerge(a, b):
  for i, j in itertools.izip(a,b):
    yield i
    yield j

这种方法的优点是,如果a和b都是无限的,就不会耗尽内存。

发电机能很好地解决你的问题。

def imerge(a, b):
    for i, j in itertools.izip(a,b):
        yield i
        yield j

相关问题 更多 >