gpt4 book ai didi

python - 带追加的列表累积

转载 作者:太空宇宙 更新时间:2023-11-03 12:56:37 25 4
gpt4 key购买 nike

我想从给定的列表(或迭代器)生成或返回一个附加累积列表。对于像 [1, 2, 3, 4] 这样的列表,我想得到,[1][1, 2] , [1, 2, 3][1, 2, 3, 4]。像这样:

>>> def my_accumulate(iterable):
... grow = []
... for each in iterable:
... grow.append(each)
... yield grow
...
>>> for x in my_accumulate(some_list):
... print x # or something more useful
...
[1]
[1, 2]
[1, 2, 3]
[1, 2, 3, 4]

这行得通,但有没有我可以与 itertools.accumulate 一起使用的操作?促进这个? (我使用的是 Python2,但文档中提供了纯 Python 实现/等价物。)

我对 my_accumulate 的另一个问题是它不能很好地与 list() 一起使用,它会为每个输出整个 some_list列表中的元素:

>>> my_accumulate(some_list)
<generator object my_accumulate at 0x0000000002EC3A68>
>>> list(my_accumulate(some_list))
[[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]]

选项 1:

我编写了自己的附加累加器函数以与 itertools.accumulate 一起使用,但考虑到 LoC 和最终有用性,使用 my_accumulate 似乎是在浪费精力更有用,(尽管在空迭代的情况下可能会失败并且消耗更多内存,因为 grow 不断增长):

>>> def app_acc(first, second):
... if isinstance(first, list):
... first.append(second)
... else:
... first = [first, second]
... return first
...
>>> for x in accumulate(some_list, app_acc):
... print x
...
1
[1, 2]
[1, 2, 3]
[1, 2, 3, 4]
>>> list(accumulate(some_list, app_acc)) # same problem again with list
[1, [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]]

(第一个返回的 elem 不是列表,只是单个项目)


选项 2:认为只进行增量切片会更容易,但使用丑陋的遍历列表长度方法:

>>> for i in xrange(len(some_list)):   # the ugly iterate over list length method
... print some_list[:i+1]
...
[1]
[1, 2]
[1, 2, 3]
[1, 2, 3, 4]

最佳答案

使用 accumulate 的最简单方法是使可迭代对象中的每个项目成为一个包含单个项目的列表,然后默认函数按预期工作:

from itertools import accumulate
acc = accumulate([el] for el in range(1, 5))
res = list(acc)
# [[1], [1, 2], [1, 2, 3], [1, 2, 3, 4]]

关于python - 带追加的列表累积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39119300/

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