【问题标题】:how to write a function like Mma's NestList in Python如何在 Python 中编写类似 Mma 的 NestList 的函数
【发布时间】:2012-09-08 06:07:08
【问题描述】:

例如: NestList(f,x,3) ----> [x, f(x), f(f(x)), f(f(f(x)))]

http://reference.wolfram.com/mathematica/ref/NestList.html

【问题讨论】:

    标签: python list function iterator


    【解决方案1】:

    使用functional 模块。它有一个名为scanl 的函数,它产生一个减少的每个阶段。然后,您可以减少 f 的实例列表。

    【讨论】:

    • 它有效,我发现了一个名为 iterate 的函数。 it=functional.iterate(lambda x: 2*x-1,2) print [it.next() for i in range(11)]
    • @chyanog 很高兴能提供帮助。不要忘记接受答案。
    • @chyanog 但是请注意,因为您拥有的是一个迭代器,所以您可以直接对其进行迭代——您不需要使用列表推导。此外,请查看 itertools 中的实用程序,以执行诸如从迭代器 (itertools.islice) 中获取切片等操作。
    • 谢谢。这对我很有用。
    【解决方案2】:
    def nest_list(f, x, i):
            if i == 0:
                return [x]
            return [x] + nest_list(f, f(x), i-1)
    
    
    def nest_list(f, x, n):
        return [reduce(lambda x,y: f(x), range(i), x) for i in range(n+1)]
    

    我找到了另一种方法!

    【讨论】:

    • 在 Python 3.3 中,您还可以将其写为 list(accumulate(repeat(x, n), lambda x,y: f(x))),使用来自 itertools 模块的 accumulaterepeat
    【解决方案3】:

    你可以把它写成一个生成器:

    def nestList(f,x,c):
        for i in range(c):
            yield x
            x = f(x)
        yield x
    
    import math
    print list(nestList(math.cos, 1.0, 10))
    

    或者如果你想将结果作为一个列表,你可以在一个循环中追加:

    def nestList(f,x,c):
        result = [x]
        for i in range(c):
            x = f(x)
            result.append(x)
        return result
    
    import math
    print nestList(math.cos, 1.0, 10)
    

    【讨论】:

    • 谢谢!我想要一个递归版本,难吗?
    • @chyanog:不,这并不难。但是为什么你想要一个递归版本呢?对于第三个参数的大值,它会降低效率并溢出堆栈。
    • 当然,有时候我只是觉得它很整洁。
    • @chyanog:对于递归版本,请考虑 nestList(f,x,c)[x] + nestList(f,f(x),c-1) 相同。
    猜你喜欢
    • 2010-12-13
    • 2017-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 2013-06-08
    • 2011-04-19
    相关资源
    最近更新 更多