是否有“更多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中是否有等价物?
答案 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]