【问题标题】:Iteration over list with shifting starting point使用移动起点迭代列表
【发布时间】:2018-10-03 10:39:46
【问题描述】:

使用 Python3,我需要从任意 i (i

【问题讨论】:

    标签: python python-3.x list iteration


    【解决方案1】:

    您可以使用itertools.chainitertools.cycle 来获得一个无限迭代,从而产生您想要的序列:

    from itertools import chain, cycle
    
    for x in chain(the_list[i:], cycle(the_list)):
        print(x)
    

    用作:

    >>> from itertools import chain, cycle
    >>> the_list = range(10)
    >>> i = 6
    >>> for x in chain(the_list[i:], cycle(the_list)):
    ...     print(x)
    6
    7
    8
    9
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    0
    [... forever ...]
    

    等效使用cycle+islice:

    >>> for x in islice(cycle(the_list), i, None):
    ...     print(x)
    >>> for x in islice(cycle(the_list), i, 20):
    ...     print(x)
    ... 
    6
    7
    8
    9
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    0
    [... forever ...]
    

    【讨论】:

    • 这里的i 是什么?
    • @jpp Op 引入名称i 指代起始索引
    • 好的,明白了,如果 OP 的代码不完整或只是伪逻辑,包含它总是有用的。
    • 似乎需要前一天的列表。
    • @jpp 我将其解释为 OP 的意思是从 i = 1 开始重复,并且 OP 错误地认为 1 是列表中的第一个索引,因为该声明没有意义。如果 OP 实际上打算做一些不同的事情,他们可以发表评论并澄清这一点。
    【解决方案2】:

    您通常可以将模运算符 % 很好地用于此类循环场景:

    days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
    
    i = 2  # Wednesday
    
    while True:
        print(days[i])
        i += 1
        i = i % len(days)  # 7 => 0
    
    Wednesday
    Thursday
    Friday
    Saturday
    Sunday
    Monday
    Tuesday
    Wednesday
    ...
    

    【讨论】:

      【解决方案3】:
      from itertools import chain, dropwhile, repeat
      
      
      def endless_daynames(starting_day):
          daynames = [
              'Monday', 'Tuesday', 'Wednesday', 'Thursday', 
              'Friday', 'Saturday', 'Sunday']
          # get starting day name 
          starting_day_name = daynames[starting_day] 
          # creating an endless iterable from an origin list
          endless_list = chain.from_iterable(repeat(daynames))
          # drop first items before we meet a required one
          shifted_list = dropwhile(lambda x: x != starting_day_name, endless_list)
          # yield values from it
          yield from shifted_list
      

      【讨论】:

      • 或者你可以使用循环():endless_list = cycle(daynames)
      【解决方案4】:

      如果我理解正确,您正在尝试在任何给定的日子里获得工作日 您可以传递工作日名称并以相同的轮换顺序获取列表。 请看看这个:-

      from collections import deque
      def rotate_week(week_days):
          a = deque(["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"])
          d = {}
          for i in range(len(a)):
              d[a[i]] = i
          number_to_rotate = d.get(week_days)
          a.rotate(-number_to_rotate)
          print(list(a))
      rotate_week('Wednesday')
      

      输出为:-

      ['Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday', 'Monday', 'Tuesday']
      

      【讨论】:

      • 结果应该是无穷无尽的
      猜你喜欢
      • 2017-10-29
      • 2012-08-07
      • 2011-01-22
      • 2016-12-02
      • 2020-09-02
      • 1970-01-01
      • 2017-02-07
      • 2018-10-27
      • 1970-01-01
      相关资源
      最近更新 更多