遍历 Python 列表,但第一个元素在末尾?

时间:2021-02-12 02:55:00

标签: python

我有一个列表,我想从元素 1 遍历它到最后,然后以元素 0 结束。也就是说,本质上它是基本的列表迭代,除了第一个元素应该在最后。

我可以用 for i in range(len(myList)): 做到这一点,然后将 1 添加到 i 并检查边缘情况(这就是我在 C++ 中的做法),但想知道 Python 是否有一些语法可以使这个概念更容易表达?

4 个答案:

答案 0 :(得分:4)

我不认为有一种方便的语法,但您可以轻松定义自己的语法:我选择了名称 irotate 类似于 itertools.islice,并以某种方式编写这样它就可以提供一个一次性的可迭代对象,例如生成器表达式。

def irotate(iterable, k=1):
    iterator = iter(iterable)
    initial_elements = [next(iterator) for _ in range(k)]
    yield from iterator
    yield from initial_elements

示例用法:

>>> list(irotate(range(5)))
[1, 2, 3, 4, 0]
>>> for x in irotate(y**2 for y in range(5)): print(x)
... 
1
4
9
16
0

答案 1 :(得分:3)

无需错误处理/检查即可实现此目标的最简单方法是仅使用 slicing

_list = [1, 2, 3, 4]

for i in _list[1:] + _list[:1]: 
    print(i)

#2
#3
#4
#1

答案 2 :(得分:0)

<块引用>

...然后将 1 添加到 i 并检查边缘情况...

如果您只想摆脱对边缘情况的检查,请使用 cycle() 标准模块中的 itertools 创建无限迭代器:

import itertools

my_list = [2, 10, "a"]
my_iter = itertools.cycle(my_list)   # 2, 10, "a", 2, 10, "a", 2, 10, "a", ...

next(my_iter)                        # drop the first element
for __ in range(len(my_list)):
    curr_elem = next(my_iter)
    print(curr_elem)                 # or do other activity with the current element

输出:

<块引用>
10
a
2

答案 3 :(得分:0)

可以使用 modulo 来得到这样的东西 -

mylist = [i for i in range(8)]
for i in range(5):
  diff = i
  rotated = [mylist[i % len(mylist)] for i in range(diff, len(mylist)+diff)]
  print(rotated)

输出是 -

[0, 1, 2, 3, 4, 5, 6, 7]
[1, 2, 3, 4, 5, 6, 7, 0]
[2, 3, 4, 5, 6, 7, 0, 1]
[3, 4, 5, 6, 7, 0, 1, 2]
[4, 5, 6, 7, 0, 1, 2, 3]

它正在创建另一个列表。所以,可能要记住这一点。

相关问题