Python3: enumerate函数中的start参数是如何工作的?

Python3: How the start parameter in enumerate function works?

我有一个清单。我想处理 variable starting point.

列表中的项目
lines = ["line 0", ..., "line 25", ...]
cursor = 25

for i, line in enumerate(lines, start=cursor):
    print("cursor is at:", cursor)
    print("start line is:", lines[cursor])
    print("actual line is:", line)

输出:

cursor is at: 25
start line is: line 25
actual line is: line 0
...

我希望 enumeratecursor 开始,但它从 0 开始。


我确定我误解了什么,但我真的很想了解 enumerate 如何改善我的 Python。

试着理解这个简单的例子:

lines = ['line 0', 'line 1', 'line 2']
cursor = 4

for idx, line in enumerate(lines, cursor):
    print(idx, '->', line)

输出:

4 -> line 0
5 -> line 1
6 -> line 2

观察:

  • idxcursor 开始(即 4)。
  • linelines 开始,也就是 lines[0],而不是从 lines[4] 开始。 (如果它从lines[4]开始,那么它应该引发IndexError: list index out of range,因为lines的长度只有3,我们只能访问lines[0],...,lines[2].)

start 参数只影响 idx 而不是 line.


我们可以使用 list slicingenumerate 来访问从 cursor 开始的项目,如下所示:

lines = ['line 0', 'line 1', 'line 2', 'line 3', 'line 4', 'line 5', 'line 6']
cursor = 4

for idx, line in enumerate(lines[cursor:], cursor):    # Used slicing: lines[cursor:]
    print(idx, '->', line)

输出:

4 -> line 4
5 -> line 5
6 -> line 6

但缺点是 slicing 会创建一个新列表,即 not memory efficient


另一种方法是使用 islice,它不会创建新列表,即 memory efficient.

from itertools import islice

lines = ['line 0', 'line 1', 'line 2', 'line 3', 'line 4', 'line 5', 'line 6']
cursor = 4

for idx, line in enumerate(
    islice(lines, cursor, len(lines)),    # Used 'islice'
    cursor,
):
    print(idx, '->', line)

输出:

4 -> line 4
5 -> line 5
6 -> line 6

阅读 Python's Official Documentation 中关于 islice 的更多信息。

除了 enumerate 可选参数 start 来设置枚举必须从哪里开始,您还需要像这样将光标作为起点添加到列表参数中 lines[cursor:]

看这个例子

values = list('abcdefghijkl')

cursor = 3
for idx, val in enumerate(values[cursor:], start=cursor):
    print(idx, val)

输出:

3 d
4 e
5 f
6 g
7 h
8 i
9 j
10 k
11 l