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
...
我希望 enumerate
从 cursor
开始,但它从 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
观察:
idx
从 cursor
开始(即 4
)。
line
从 lines
开始,也就是 lines[0]
,而不是从 lines[4]
开始。 (如果它从lines[4]
开始,那么它应该引发IndexError: list index out of range
,因为lines
的长度只有3,我们只能访问lines[0]
,...,lines[2]
.)
即start
参数只影响 idx
而不是 line
.
我们可以使用 list slicing
和 enumerate
来访问从 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
我有一个清单。我想处理 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
...
我希望 enumerate
从 cursor
开始,但它从 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
观察:
idx
从cursor
开始(即4
)。line
从lines
开始,也就是lines[0]
,而不是从lines[4]
开始。 (如果它从lines[4]
开始,那么它应该引发IndexError: list index out of range
,因为lines
的长度只有3,我们只能访问lines[0]
,...,lines[2]
.)
即start
参数只影响 idx
而不是 line
.
我们可以使用 list slicing
和 enumerate
来访问从 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