如何解决将此 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 指出错误。现在工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。