【问题标题】:Iterate Through a List Given a Starting Point给定起点遍历列表
【发布时间】:2016-01-04 23:45:22
【问题描述】:

假设您有一个列表,并且给您一个起点(例如第三个索引)。您将如何从该索引开始遍历列表,然后循环访问列表中的所有元素?意思是,您可以在列表的中间开始迭代,但是一旦到达末尾,您将从头开始继续,直到列表中的每个元素都被访问过。做这样的事情最干净、最有效的方法是什么?理想情况下,我正在寻找对 python 伪 for x in list starting with i: 有效的东西。

【问题讨论】:

    标签: python list loops indexing iteration


    【解决方案1】:

    为了返回(不使用 itertools),您必须使用除法运算符的余数:

    i = start_index
    while i < len(mylist) + start_index:
        print mylist[i % len(mylist)]
        i+=1
    

    或者甚至更好,正如@jonrsharpe 指出的那样:

    for idx in range(len(mylist)):
         print  mylist[(idx + start_index) % len(mylist)]
    

    为了完整起见,并且因为在这种情况下生成器会更高效,正如@Régis B. 所建议的那样,您可以:

    def mygen(lst, start):
        for idx in range(len(lst)):
            yield  lst[(idx + start) % len(lst)]
    

    【讨论】:

    • 我倾向于使用for index in range(len(mylist)): print mylist[(index + start_index) % len(mylist)] 之类的东西,而不是while 循环。
    • @rll 我怀疑它因此而被否决...可能是因为 i++,您很快将其删除。
    【解决方案2】:

    如果您的列表很大并且您想避免复制列表的某些部分,那么您需要使用自定义迭代器:

    def starting_with(arr, start_index):
         # use xrange instead of range in python 2
         for i in range(start_index, len(arr)):
            yield arr[i]
         for i in range(start_index):
            yield arr[i]
    
    for value in starting_with(my_list, 3):
        ...
    

    【讨论】:

      【解决方案3】:

      您可以创建自己的迭代器函数,该函数非常方便(且高效)地执行此操作,如下所示。

      重要的是要注意,正如所写,您可以向它传递一个负索引,列表的长度有效添加到该索引,因此-2 表示列表中倒数第二个项目 - 这这正是 Python 本身通常处理列表负索引的方式。

      try:
          xrange
      except NameError:  # Python 3
          xrange = range
      
      def starting_with(start_index, seq):
          if start_index > 0:
              start_index = start_index-len(seq)
          for i in xrange(start_index, len(seq)+start_index):
              yield seq[i]
      
      for value in starting_with(3, my_list):
          ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-28
        • 2016-06-25
        • 1970-01-01
        • 2010-12-18
        • 2022-01-07
        相关资源
        最近更新 更多