Itertools部分列出了python

时间:2017-01-13 00:06:11

标签: python

我有这个人。 python中的列表:

[1, 2, 3, 4]

是否有python itertools函数导致foll:

[1]
[1, 2]
[1, 2, 3]
[1, 2, 3, 4]

6 个答案:

答案 0 :(得分:6)

如果没有itertools,这是微不足道的:

def fall(it):
    ls = []
    for x in it:
        ls.append(x)
        yield ls

for x in fall(xrange(20)):
    print x

请注意,这适用于任何可迭代的,而不仅仅是列表。

如果你仍然需要itertools,那么这样的东西应该可以工作(py3):

for x in itertools.accumulate(map(lambda x: [x], it)):
     print(x)

同样,它是懒惰的,适用于任何可迭代的。

答案 1 :(得分:3)

我可以想到itertools中没有任何内容,但这应该有效:

def incremental(L):
    for i in range(1, len(L)+1):
        yield L[:i]

输出:

In [53]: print(*incremental([1, 2, 3, 4]), sep='\n')
[1]
[1, 2]
[1, 2, 3]
[1, 2, 3, 4]

答案 2 :(得分:2)

如果必须才能使用itertools,您可以使用itertools.islice作为:

from itertools import islice
my_list = [1, 2, 3, 4]

for i in range(1, len(my_list)+1):
    print list(islice(my_list, i))

但是这里绝对不需要使用itertools。您可以通过简单的列表切片实现此目的:

for i in range(len(my_list)):
    print my_list[:i+1]

上述两种解决方案都会将结果打印为:

[1]
[1, 2]
[1, 2, 3]
[1, 2, 3, 4]

答案 3 :(得分:2)

这可以使用列表理解编写为单行:

>>> [ list[:x+1] for x in range(len(list)) ]
[[1], [1, 2], [1, 2, 3], [1, 2, 3, 4]]

答案 4 :(得分:1)

一线解决方案,使用partialislice

from itertools import islice
from functools import partial
my_list = [1, 2, 3, 4]

[list(l) for l in map(partial(islice, my_list), range(1,len(my_list)+1))]

你明白了,

[[1], [1, 2], [1, 2, 3], [1, 2, 3, 4]]

换句话说,

from itertools import islice
from functools import partial
my_list = [1, 2, 3, 4]
p = partial(islice, my_list)
for i in range(1,5):
    print(list(p(i)))

你明白了,

[1]
[1, 2]
[1, 2, 3]
[1, 2, 3, 4]

答案 5 :(得分:0)

您不需要itertools,只需使用地图:

>>> l = [1, 2, 3, 4]
>>> for sub_list in map(lambda index: l[:index + 1], range(len(l))):
...     print sub_list