python - 从某个索引开始迭代列表
问题描述
这是一个例子:
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_
。我该如何优化呢?
解决方案
要复制切片,但每次迭代都在 O(1) 时间内,您可以使用collections.deque
with 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是切片的长度。
推荐阅读
- html - 缩小屏幕尺寸时保持边距?
- c++ - 模板化字段引用模板参数可以作为第一个模板参数传递吗?
- python - 使用关联值旋转一个数据框列以创建多列
- android - 如何使用 Kotlin 的 Parcelize 对 HashMap 进行 Parcelize?
- bash - 带有 for 循环的远程 SSH 命令
- html - 链接到另一个 html 页面的按钮标记
- c# - HTTPS url 上的 C# WebRequest POST 方法自动使用 http url
- c# - IF 和 Else 语句异常处理帮助 - Else 消息不起作用
- c++ - Kosaraju 的 SCC 递归程序在执行大输入时自动终止
- php - 如何在没有重复的情况下进行排列?