将此 For 循环转换为列表推导式

问题描述

import { FETCH_USER } from "../actions/types";
import { CHECKOUT_SESSION_CREATED } from "../actions/types";

const initialState = {
  sessionId: null,};

export default function (state = initialState,action) {
  switch (action.type) {
    case FETCH_USER:
      return action.payload || false;
    case CHECKOUT_SESSION_CREATED:
      state = {
        ...state,sessionId: action.payload,};
      return state;
    default:
      return state;
  }
}

正确返回: 数组([0.5,0.6,0.5,0.75,0.75])

我可以将其重写为列表推导式或其他更短的算法吗?

解决方法

您可以使用itertools.accumulate

from itertools import accumulate

def transform_cbdeltas_to_rates(mp,r):
    dd = list(accumulate((m/100 for m in mp),initial=r))
    return np.array(dd)

我很确定有一个 numpy 等价于积累东西(例如 numpy.ufunc.accumulate),但我不是 numpy 专家。

,

Schwobaseggl 发布了一个完全可以接受的答案,所以我不会过多地扩展他们的答案。 numpy 的做事方式,确实更短而且速度更快:

def transform_cbdeltas_to_rates_numpy(mp,r):
    return np.concatenate(([r],np.add.accumulate(mp/100)+r))

%timeit np.concatenate(([r],np.add.accumulate(mp/100)+r))
4.11 µs ± 58.7 ns per loop (mean ± std. dev. of 7 runs,100000 loops each)

%timeit dd = np.array(list(accumulate((m/100 for m in mp),initial=r)))
7.59 µs ± 189 ns per loop (mean ± std. dev. of 7 runs,100000 loops each)
,

这是 numpy 版本:

mp =np.array([10,-10,25,0.0])

def transform_cbdeltas_to_rates(mp,(np.cumsum(mp.copy()) * 0.01) + r))

transform_cbdeltas_to_rates(mp,.5)

编辑:感谢@Jacob Faib 指出错误。现在工作。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...