【问题标题】:Python list comprehension [duplicate]Python列表理解[重复]
【发布时间】:2011-06-15 11:32:39
【问题描述】:

可能重复:
List comprehension for running total

我正在尝试编写一个简洁的列表理解语句来创建一个 cdf: 例如:

print f([0.2, 0.3,0.1,0.4])
[0.2,0.5,0.6,1.0] 

标准过程如下所示(我想为函数 f() 写一个列表推导):

def f(probabilities) :

    sum = 0
    returnList = []
    for count in probabilities:
        sum +=count
        returnList = returnList + [sum]
    return returnList

编辑:我找到了一个函数 numpy.cumsum()。我会检查它是否使用列表推导。

【问题讨论】:

  • @Elalfer — 听起来他想写一个列表解析,其行为与他的 f() 函数的行为相同。
  • 没错。我的错,我应该更明确。
  • 那么你也可以用 numpy/scipy 标记问题。 numpy.cumsum() 不使用列表理解。您能否详细说明您想要实现的目标?
  • @jleedev 和其他关闭此问题的人:我是 SO 的新手,但我不会认为这个问题与可能的重复问题足够相似。具体请参阅我的答案的更新,其中应该清楚问题不是(仅)关于运行总数。本质上,cdf 必须总和为 1,并且由于 OP 确定了对 Numpy 的兴趣,为什么不让更多答案流入 ;-)。

标签: python functional-programming list-comprehension


【解决方案1】:

该操作非常普遍,以至于许多语言(主要是函数式语言,但不仅如此)为其提供了抽象,通常名称为scanl(就像reduce 具有中间结果)。我们称之为ireduce(“迭代减少”):

def ireduce(f, state, it):
    for x in it:
        state = f(state, x)
        yield state

现在使用它:

import operator

def f(probabilities):
    return ireduce(operator.add, 0, probabilities)

print(list(f([0.2, 0.3,0.1,0.4])))
# [0.2, 0.5, 0.6, 1.0]

【讨论】:

  • 这是一个工具箱里的好东西;但是我们肯定可以想出一个更 Pythonic 的名称,而不是复制其他语言的名称吗? FWIW,C++调用这个std::partial_sum,并且默认使用加法作为操作。
  • @Karl。有些人称之为ireduce,我有点喜欢它。 “partial_sum”在添加时是个好名字,但与其他操作一起似乎有点误导。
【解决方案2】:

它不是很漂亮,而且它没有使用列表推导,但是你可以使用 reduce() 函数来做到这一点,其中累积的值是一个包含当前总和和结果列表的元组:

a = [0.2, 0.3, 0.1, 0.4]
reduce((lambda result, val: (result[0] + val, result[1] + [result[0] + val])), a, (0, []))[1]

Python 缺乏对多行 lambda 的支持,这使得这种情况很难看。使用单独的函数会更好:

    a = [0.2, 0.3, 0.1, 0.4]   
    def accumulate(result, val):
        return (result[0] + val, result[1] + [result[0] + val])

    reduce(accumulate, a, (0, []))[1]

【讨论】:

    【解决方案3】:
    [sum(probabilities[:i+1]) for i in range(len(probabilities))]
    

    但不要这样做,因为它是 O(n^2)。 Python 列表推导不是为此而设计的。使用您已经编写的程序代码。

    【讨论】:

    • 现在这是一个很棒的列表理解。
    猜你喜欢
    • 2018-03-20
    • 2017-02-27
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-26
    • 2021-04-20
    • 2021-10-06
    相关资源
    最近更新 更多