Python反向生成器

ak.*_*ak. 17 python reverse generator

我正在寻找一种方法来反转生成器对象.我知道如何反转序列:

foo = imap(seq.__getitem__, xrange(len(seq)-1, -1, -1))
Run Code Online (Sandbox Code Playgroud)

但是,作为输入的发生器和输出的反向发生器(len(seq)保持不变,可以使用原始序列中的值)可能类似吗?

jcd*_*yer 24

您不能以任何通用方式反转生成器,除非将其转换为序列并从中创建迭代器.在计算出先前的生成器之前,不一定知道生成器的后期术语.

更糟糕的是,你不知道你的发电机是否会遇到StopIteration异常,直到你击中它,所以你无法知道你的序列中的第一个术语会是什么.

你能做的最好的事情就是写一个reversed_iterator函数:

def reversed_iterator(iter):
    return reversed(list(iter))
Run Code Online (Sandbox Code Playgroud)

编辑:当然,您也可以使用基于imap的迭代版本替换逆转,以保存一个列表创建.

  • 严格来说,`list(iter)`不是*cast*,它是通过使用iterator iter构造一个列表.我不确定Python是否有任何*cast*函数,至少不是因为该术语在C或Java等语言中使用.int("100")不是强制转换,float(100)不是强制转换 - 两者都是返回对象的构造函数.在C中,如果某些东西被投射,原始对象保持不变.如果你在Python中做了这样的事情,你可以获取原始值的id和转换值,它们将是相同的.简而言之:在Python中,演员阵容已经死亡. (15认同)
  • @Paul McGuire:我同意你所说的重要部分.但有一点:在C中,演员*可以*改变原始对象.如果你将100转为浮动,C会将其改为100.0f; C不会简单地将位模式0x00000064抛入float变量,而是让它变成浮点数中的任何值.在C中,强制转换可以简单地改变类型(将`int*`更改为`long int*`,或将`int`更改为`long int`)或者可以更改值和类型.C++有几个转换操作符,包括一个"重新解释"类型而不改变值的操作符. (2认同)
  • @PaulMcGuire,我可能会误解你的意思,但是在*C演员和Python对象构造中,原始值保持不变.在C表达式中使用`float(i)`会使`i`保持不变,就像它在Python中保留原始的`i`对象一样.并且Python中新构建的对象肯定*不具有与原始值相同的ID!可以很容易地证明:`i = 1; float(i)是i`→`False`. (2认同)

Ste*_*osh 6

reversed(list(input_generator)) 可能是最简单的方法.

没有办法以"反向"顺序获取生成器的值而不首先将它们全部收集到序列中,因为生成第二项很可能完全依赖于生成的第一项.