【问题标题】:How to iterate a list starting from different index, and also wrap around如何从不同的索引开始迭代列表,并环绕
【发布时间】:2020-01-15 02:30:03
【问题描述】:

在此处提出了类似问题 (Start index for iterating Python list),但我还需要一件事。

假设我有一个列表 [Sunday, Monday, ...Saturday], 我想从不同的位置开始迭代列表,环绕并完成循环。 例如

a = [Sunday, Monday, ...Saturday]
for i in range(7):
    print("----")
    for j in (SOMETHING):
        print(j)

OUTPUT:
----
Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
----
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday
----
Tuesday
.
.
.
Friday

我该如何处理?

【问题讨论】:

标签: python list


【解决方案1】:

一种方法是使用collections.deque

from collections import deque
from itertools import repeat

d = deque(['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'])

n = 7
for i in repeat(d, n):
    print(*i, sep='\n')
    print('-----')
    i.rotate(-1)

Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
-----
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday
-----
Tuesday
.
.
.

虽然您可能会发现创建嵌套列表更有趣:

n = 7
l = []
for i in repeat(d, n):
    sl = []
    for j in i:
        sl.append(j)
    l.append(sl)
    i.rotate(-1)

print(l)
# [['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], 
#  ['Monday', 'Tuesday', 'Wednesday'...

【讨论】:

  • 感谢您的回答。这种方法会在内存中创建 7 个列表吗?
  • repeat 是在重复 fed 迭代器 7 次,结果只是简单地打印出来,这似乎是你想要做的 @user12062120
【解决方案2】:

您可以使用生成器 chain 从当前索引开始的元素(在您的情况下,当前索引是 i)与当前索引之前的元素一起使用生成器,这样您就不会创建新列表,而是记忆-高效:

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

from itertools import chain
for i in range(7):
    print("----")
    for j in chain((e for e in a[i:]), (e for e in a[:i])):
        print(j)

输出:

----
Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
----
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday
----
Tuesday
Wednesday
Thursday
Friday
Saturday
Sunday
Monday
----
Wednesday
Thursday
Friday
Saturday
Sunday
Monday
Tuesday
----
Thursday
Friday
Saturday
Sunday
Monday
Tuesday
Wednesday
----
Friday
Saturday
Sunday
Monday
Tuesday
Wednesday
Thursday
----
Saturday
Sunday
Monday
Tuesday
Wednesday
Thursday
Friday

【讨论】:

    【解决方案3】:

    您可以使用collections.dequeue,它有一个rotate 方法。但是,如果您想自己制作,可以这样做:

    >>> a = ['a','b','c','d']
    >>> counter = 0
    >>> start_index=2
    >>> while counter < len(a):
    ...     print(a[start_index])
    ...     start_index+=1
    ...     counter += 1
    ...     if start_index==len(a):
    ...             start_index=0
    ... 
    c
    d
    a
    b
    

    这是非常理想的,因为您不需要制作任何副本或创建新列表,只需迭代即可。

    【讨论】:

      【解决方案4】:

      您可以弹出开始项目并将其添加到末尾。

      days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
      for _ in range(7):
          print("----")
          print("\n".join(days))
          days.append(days.pop(0))
      

      【讨论】:

        【解决方案5】:

        如果您不想导入任何库。

        DAYS = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
        for i in range(7):
            print("----")
            for j in range(len(DAYS)):
                print(DAYS[(j+i) % len(DAYS)])
        

        【讨论】:

          【解决方案6】:

          使用以下函数:

          def cycle_list(l, i):
           for element in l[i:]:
            yield element
           for element in l[:i]:
            yield element
          

          【讨论】:

            【解决方案7】:

            使用itertools.cycle

            from itertools import cycle
            
            counter = 1
            days = ['Sunday', 'Monday', 'Tuesday']
            for day in cycle(days):
                print(day)
                counter += 1
                if counter == 7:
                    print('-----')
                    counter = 1
            

            【讨论】:

              【解决方案8】:

              可以通过以下方式完成:

              a[i:]+a[:i]
              

              【讨论】:

              • 这将导致一个新的列表创建
              猜你喜欢
              • 2019-05-25
              • 1970-01-01
              • 1970-01-01
              • 2011-09-03
              • 2021-02-23
              • 2017-11-13
              • 2014-01-15
              • 1970-01-01
              • 2020-08-09
              相关资源
              最近更新 更多