首页 > 解决方案 > 从某个索引开始迭代列表

问题描述

这是一个例子:

list_ = [5, 'cat', 0xDEADBEEF, 4.0]

for offset in range(len(list_)):
    result = 0
    for elem in list_[offset:]:
        result = func(result, elem)
    return result

wherefunc是不可交换的。

在上面的代码中,list_[offset:]将创建一个新列表,但我只需要一个视图即可list_。我该如何优化呢?

标签: pythonarrayslistiteratoriteration

解决方案


要复制切片,但每次迭代都在 O(1) 时间内,您可以使用collections.dequewith popleft

from collections import deque

dq = deque(list_)

for i in range(len(dq)):
    print(dq)
    dq.popleft()

结果:

deque([5, 'cat', 3735928559, 4.0])
deque(['cat', 3735928559, 4.0])
deque([3735928559, 4.0])
deque([4.0])

这应该比列表切片更有效:参见deque.popleft() 和 list.pop(0)。有性能差异吗?. 还要注意列表切片在 O( k ) 时间内工作,其中k是切片的长度。


推荐阅读