【问题标题】:Start index for iterating Python list用于迭代 Python 列表的开始索引
【发布时间】:2011-09-03 03:59:25
【问题描述】:

在 Python 中迭代列表时设置起始索引的最佳方法是什么。例如,我有一个星期的列表 - 星期日,星期一,星期二,......星期六 - 但我想从星期一开始遍历列表。这样做的最佳做法是什么?

【问题讨论】:

  • 您是只想循环播放到星期六,还是希望它在最后一个星期天循环播放?
  • 我只想循环到周六。直到现在我才意识到你可以在 Python 列表中使用切片。
  • 是否有一种解决方案也可以处理生成器/可迭代对象,而不仅仅是列表?还是非常大的列表?

标签: python iteration


【解决方案1】:

你可以使用slicing:

for item in some_list[2:]:
    # do stuff

这将从第三个元素开始并迭代到最后。

【讨论】:

  • 这正是我想要的。谢谢!
  • 这对于大型列表不是效率低下吗?我相信这个切片操作必须将被引用的列表元素复制到一个新列表中。
  • 是的,这对于大型列表来说效率很低。有关不复制的解决方案,请参阅下面的 gnibbler 答案。
  • 如果你使用生成器/迭代器循环,你怎么做?
  • 您应该使用 islice,正如 John La Rooy 的回答中所建议的那样。
【解决方案2】:

islice的优点是不需要复制部分列表

from itertools import islice
for day in islice(days, 1, None):
    ...

【讨论】:

    【解决方案3】:

    您始终可以使用索引计数器循环使用传统的 C 样式循环:

    for i in range(len(l)-1):
        print l[i+1]
    

    遵循“每个元素上的循环”样式总是更好,因为这是正常的做法,但如果它妨碍您,请记住也始终支持常规样式。

    【讨论】:

      【解决方案4】:

      stdlib 会勾引你儿子!

      deque.rotate():

      #!/usr/local/bin/python2.7
      
      from collections import deque
      
      a = deque('Monday Tuesday Wednesday Thursday Friday Saturday Sunday'.split(' '))
      a.rotate(3)
      deque(['Friday', 'Saturday', 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday'])
      

      【讨论】:

        【解决方案5】:

        为什么人们要使用列表切片(很慢,因为它会复制到新列表)、导入库函数或尝试为此旋转数组?

        使用带有range(start, stop, step) 的普通for 循环(其中startstep 是可选参数)。

        例如,循环从索引 1 开始的数组:

        for i in range(1, len(arr)):
            print(arr[i])
        

        【讨论】:

        • 这应该是真正的答案
        【解决方案6】:

        如果您只想从Monday 开始打印,您可以使用listindex 方法查找“星期一”在列表中的位置,然后按照其他帖子中的说明从那里进行迭代.使用list.index 可以节省您对“星期一”的索引进行硬编码,这是一个潜在的错误来源:

        days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
        for d in days[days.index('Monday'):] :
           print d
        

        【讨论】:

        • 非常好的解决方案!
        【解决方案7】:

        这是一个旋转生成器,它不需要对输入序列进行扭曲副本...如果输入序列远大于 7 个项目,它可能会很有用。

        >>> def rotated_sequence(seq, start_index):
        ...     n = len(seq)
        ...     for i in xrange(n):
        ...         yield seq[(i + start_index) % n]
        ...
        >>> s = 'su m tu w th f sa'.split()
        >>> list(rotated_sequence(s, s.index('m')))
        ['m', 'tu', 'w', 'th', 'f', 'sa', 'su']
        >>>
        

        【讨论】:

        • 是的 - 并且很容易扩展以生成无限循环序列。
        • 忍不住感谢@JohnMachin:为这 264 年来死去的人做了伟大的工作
        【解决方案8】:

        如果您想“环绕”并有效地轮换列表以从星期一开始(而不是仅仅在星期一之前删除项目):

        dayNames = [ 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 
                    'Friday', 'Saturday',  ]
        
        startDayName = 'Monday'
        
        startIndex = dayNames.index( startDayName )
        print ( startIndex )
        
        rotatedDayNames = dayNames[ startIndex: ] + dayNames [ :startIndex ]
        
        for x in rotatedDayNames:
            print ( x )
        

        【讨论】:

          猜你喜欢
          • 2019-05-25
          • 2017-11-13
          • 1970-01-01
          • 2010-09-12
          • 2020-01-15
          • 2014-03-04
          • 2021-02-23
          • 1970-01-01
          • 2018-09-21
          相关资源
          最近更新 更多