【问题标题】:python continuing a loop from a specific indexpython从特定索引继续循环
【发布时间】:2016-10-11 11:19:09
【问题描述】:

我写了一些代码,使用 enumerate 来遍历一个列表。

for index, item in enumerate(list[start_idx:end_idx])
     print('index [%d] item [%s]'%(str(index), item))

列表中的项目只是字符串。有时我不想枚举整个列表,有时我会切分列表做不同的事情。

我遇到问题的部分是python的枚举函数。

文档说你可以做到:

for index, item in enumerate(list, start_index):
    print(str(index))

上面的代码没有达到我的预期。我虽然 enumerate 会从开始位置开始并在结束时停止,但事实并非如此。

我写了一个小程序,它的表现确实很不稳定。

>>> for i, x in enumerate(range(0,20),start=4):
...      print(str(i)+'\t'+str(x))
... 
4   0
5   1
6   2
7   3
8   4
9   5
10  6
11  7
12  8
13  9
14  10
15  11
16  12
17  13
18  14
19  15
20  16
21  17
22  18
23  19

我希望 enumerate 从索引 4 开始并循环到末尾。所以它会得到 4-19 的范围,但它似乎只是开始索引,但仍然从 0-19 迭代..

问题,有没有办法从 python 中的特定索引开始进行迭代循环?

我的预期结果是

>>> for i, x in enumerate(range(0,20),start=4):
...      print(str(i)+'\t'+str(x))
... 
4   0 # skip
5   1 # until
6   2 # this
7   3 # item
8   4
9   5
10  6
11  7
12  8
13  9
14  10
15  11
16  12
17  13
18  14
19  15
20  16
21  17
22  18
23  19

而不是在开始位置提供索引。

【问题讨论】:

  • start 的论点,我想说,是装饰性的。当你想从 1 开始计数时通常很有用,而不是默认的 0
  • 顺便说一句:我觉得你在这里做的事情有点代码味道。您不需要enumerate,因为这意味着您正在修改列表的成员并将它们设置回原位。如果您静态处理列表,则根本不需要管理索引,并且可以简单地遍历切片。

标签: python loops enumerate


【解决方案1】:

实际上,如果您有 range 对象,则从中切出一部分并不是什么大问题,因为 range(n)[:4] 仍然是 range 对象(@MosesKoledoye 提到它是 Python 3 的功能) .但是如果你有一个列表,为了不创建新列表你可以选择itertools.islice,它会返回迭代器。

from itertools import islice
for index, item in enumerate(islice(range(20), 4, None)):
    print(index, item)

输出

0 4
1 5
2 6
3 7
4 8
...

【讨论】:

  • range(n)[:4] 仍然是范围对象 仅适用于 Python 3
  • @MosesKoledoye 你是对的,我会在回答中提到这一点。
  • 我编辑了这个;对于索引,枚举中的项目(islice(范围(20),4,无),4);这将使 bot 索引从 4 以及开始
  • @user1610950 可以,很高兴帮助了你!
【解决方案2】:

enumeratestart 参数与选择迭代的哪些元素没有任何关系。它只是告诉枚举从哪个数字开始。

>>> list(enumerate(range(3)))
[(0, 0), (1, 1), (2, 2)]
>>> list(enumerate(range(3), 1))
[(1, 0), (2, 1), (3, 2)]

如果你想从一个特定的索引开始,你需要提供开始参数一个slice:

for i, v in enumerate(alist[4:], 4):
    ...

【讨论】:

    【解决方案3】:

    你可以这样做:

    for index, item in enumerate(list[4:]):
        print(str(index))
    

    【讨论】:

    • 如果这样做,列表索引将不会与枚举输出对齐。
    • @kojiro 然后你可以做for index, item in enumerate(list[4:],4):
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多