我有一个列表,我想从元素 1 遍历它到最后,然后以元素 0 结束。也就是说,本质上它是基本的列表迭代,除了第一个元素应该在最后。>
我可以用 for i in range(len(myList)):
做到这一点,然后将 1 添加到 i 并检查边缘情况(这就是我在 C++ 中的做法),但想知道 Python 是否有一些语法可以使这个概念更容易表达?
答案 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]
它正在创建另一个列表。所以,可能要记住这一点。