【问题标题】:Iterate generator in tuples in python [duplicate]在python中的元组中迭代生成器[重复]
【发布时间】:2016-06-26 20:05:40
【问题描述】:

假设我有一个列表

xs = [0,1,2,3]
[some_function(current, next) for current, next in zip(xs, xs[1:])]

我想迭代这个列表的对(当前,下一个)。为了澄清 zip 创建列表 [(0,1), (1,2), (2,3)]

问题是,如果 xs 是一个生成器而不是列表来使用 zip 实现这一点,我需要从中创建一个列表,这肯定不是最佳解决方案。

【问题讨论】:

  • 尽管提议的骗子说它的输入是一个列表,而这表示输入不是一个列表,但使用itertools.tee 的答案是相同的。

标签: python generator lazy-evaluation


【解决方案1】:

您可以使用itertools.tee(iterable, n=2) 从一个迭代器创建多个独立的迭代器。

my_iter, next_iter = tee(myiter)
next(nextiter)

[some_function(current, ne) for current, ne in zip(myiter, nextiter)]

【讨论】:

  • 很好,我不知道存在
【解决方案2】:

这适用于无限迭代器等情况。

def pairwise(iterator):
    """Iterate over pairs of an iterator."""
    last = next(iterator)
    while True:
        this = next(iterator)
        yield last, this
        last = this

【讨论】:

  • 我想过,但是如果你需要迭代三元组、大小为 n 的元组等,这会稍微复杂一些。
  • @user1685095 然后您可以使用deque 并将maxsize 设置为n。但是就用另一个答案吧,我不知道itertools.tee
【解决方案3】:

您可以先将迭代器转换为列表(如果您确定迭代器不能是无限的):

xs = list(xs)
[some_function(current, next) for current, next in zip(xs, xs[1:])]

【讨论】:

  • 这可能适用于这种情况,但无限迭代器呢?
  • 他说他知道他能做到。他说这肯定不是最佳解决方案。
猜你喜欢
  • 2018-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-31
  • 2018-11-01
  • 1970-01-01
相关资源
最近更新 更多