【问题标题】:Python: iterating over a list range without duplicating it [duplicate]Python:迭代列表范围而不复制它[重复]
【发布时间】:2019-03-14 06:56:53
【问题描述】:

假设我有列表list_1,并且我想遍历它的元素,从索引i(j - 1),其中j > i

据我所知,我的选择是:

选项 1:构建一个全新的列表

for element in list_1[i:j]:
    # do something

选项 2:迭代索引本身

for index in range(i, j):
    element = list_1[index]
    # do something

这两个选项都不可取。第一个选项是不可取的,因为它涉及构建一个新列表。第二个选项是不可取的,尤其是在可读性方面,因为它的迭代是在索引上,而不是在列表元素上。

是否有一个内置的生成器函数可以迭代给定范围内的元素?

【问题讨论】:

  • 讽刺的是,这是重复的

标签: python list indexing iterator


【解决方案1】:

您可以使用itertools.islice() 按索引遍历值的子集:

from itertools import islice

for element in islice(list_1, i, j):

这仍将遍历 list_1 的所有 i - 1 初始值,但将在 C 中这样做,并且不会将跳过的值保留在内存中。

演示:

>>> from itertools import islice
>>> list_1 = [42, 81, 117, 3103, 17, 22]
>>> for elem in islice(list_1, 2, 5):
...     print(elem)
...
117
3103
17

【讨论】:

  • 谢谢。这看起来就像我希望拥有的一样。
  • 这个itertools 模块似乎是Python 程序员必须学习和掌握的东西。很遗憾我不经常使用它。有使用约定吗?使用from itertools import <func> 而不是import itertools as it 然后使用it.<func>() 是否更常见?
  • @SomethingSomething:我像使用任何其他标准库模块一样使用它,我通常不缩写模块名称。这种做法更常见于数据科学包,因为它们在 Jupyther 笔记本中以交互方式使用这些包,而较短的名称更重要。
猜你喜欢
  • 2014-01-16
  • 2012-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-20
  • 2013-05-09
  • 2016-12-28
  • 1970-01-01
相关资源
最近更新 更多