gpt4 book ai didi

python - 用cap在python中积累

转载 作者:太空狗 更新时间:2023-10-30 02:53:18 24 4
gpt4 key购买 nike

我有一个 list

nums=[1,2,4,6]

我想累积上限为 5 的列表,即如果累积值超过 5 的倍数,它应该打印 5 的倍数的值,然后打印该值

预期输出:

1
3
5
7
10
13

编写的代码如下:

nums=[1,2,4,6]
from itertools import accumulate
a= accumulate(nums)

for i in a:
print(i)

现在正在打印的输出

1
3
7
13

我怎样才能得到想要的输出

最佳答案

这是使用生成器表达式的 Pythonic 方法:

In [12]: from itertools import accumulate, chain

In [13]: list(chain.from_iterable((i,) if i < 5
else (next(j for j in range(i, 0, -1) if j%5 == 0), i)
for i in accumulate(nums)))
Out[13]: [1, 3, 5, 7, 10, 13]

逻辑是循环累加的结果,然后对于大于 5 的数字,找到它之前的第一个数字(使用反向范围和 next 函数),它是 5 的倍数。然后使用 itertools.chain() 连接结果。

从算法的角度来看,不是在列表上执行多次循环,一次是通过累加,另一次是为了找到预期的数字,您可以在一次遍历中执行此操作,如下所示:

In [18]: def myaccumulate(lst):
...: total = 0
...: for num in lst:
...: total += num
...: for i in range(total, num, -1):
...: if i%5 == 0:
...: yield i
...: break
...: yield total
...:

演示:

In [19]: list(myaccumulate(nums))
Out[19]: [1, 3, 5, 7, 10, 13]

这种方法实际上比基于生成器的方法更快:

In [20]: %timeit list(myaccumulate(nums))
2.65 µs ± 47.9 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

In [21]: %timeit list(chain.from_iterable((i,) if i < 5 else (next(j for j in range(i, 0, -1) if j%5 == 0), i) for i in accumulate(nums)))
4.12 µs ± 21.3 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

关于python - 用cap在python中积累,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50219763/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com