迭代列表的所有部分“头部”列表

时间:2017-11-07 10:56:41

标签: python python-3.x iteration

是否有“更多Pythonic”的方式:

l=list(range(5)) # ANY list, this is just an example
list(l[:i] for i in range(1, len(l)))

Out[14]: [[0], [0, 1], [0, 1, 2], [0, 1, 2, 3]]

E.g。不使用索引。

在C ++中,可以使用一对(start,end)迭代器构造一个序列。 Python中是否有等价物?

2 个答案:

答案 0 :(得分:1)

您可以使用itertools.islice

>>> import itertools
>>> l=list(range(5))
>>> [list(itertools.islice(l, x)) for x in range(1,len(l))]
[[0], [0, 1], [0, 1, 2], [0, 1, 2, 3]]

你可以检查执行时间:有两个因素的内存性能和速度。

>>> timeit.timeit('[list(itertools.islice(l, x)) for x in range(1,len(l))]', setup='l=list(range(5))')
3.2744126430006872
>>> timeit.timeit('list(l[:i] for i in range(1, len(l)))', setup='l=list(range(5))')
1.9414149740005087

你走了:

>>> [list(range(x)) for x in range(1, 5)]
[[0], [0, 1], [0, 1, 2], [0, 1, 2, 3]]

答案 1 :(得分:1)

要明确的是,如果你的目标是“Pythonic”,我认为你当前使用索引的例子是大多数Python程序员会做的。

话虽如此,您还提到使用一对(开始,结束)值创建对象。 Python有slice个对象,这是方括号索引(对象的__getitem__调用)内部使用的对象。它可以使用内置slice函数创建:

>>> my_list = [0, 1, 2, 3, 4]
>>> slice1 = slice(0, 3)
>>> slice1.start
0
>>> slice1.stop
3
>>> my_list[slice1]
[0, 1, 2]
>>> slice2 = slice(1, 2)
>>> my_list[slice2]
[1]

当然,只有在my_list可以编入索引时才有效。如果你想让它适用于一般的iterables,@ Hackaholic使用itertools.islice的答案是我会使用的。

是的,这仍然意味着你最终需要使用方括号索引。这里的不同之处在于您将部分磁头的(开始,停止)值存储在可用于实际创建部分磁头的对象中。

现在回到你的例子:

>>> slices = [slice(0, x) for x in range(len(any_list))]
>>> partial_heads = [any_list[slc] for slc in slices]