有没有办法循环Python列表中的所有值,但从特定索引开始?
例如:
li = ['a', 'b', 'c', 'd']
开始在索引1处循环并打印出结果。我的预期输出是:
['b', 'c', 'd', 'a']
我知道使用两个" for循环"能做到这一点,但有没有更好的方法呢?
答案 0 :(得分:5)
好吧,您可以使用支持collections.deque
的内置"rotating"类:
>>> from collections import deque
>>> li = deque(['a', 'b', 'c', 'd'])
>>> li.rotate(-1)
>>> li
deque(['b', 'c', 'd', 'a'])
万一你真的想要一个列表作为结果,你总是可以将它再次转换回来:
>>> list(li)
['b', 'c', 'd', 'a']
答案 1 :(得分:3)
您可以使用切片执行此操作:
l2 = [*li[1:], *li[:1]]
for i in l2:
print(i)
适用于Pythons> = 3.5
。对于之前的版本,您可以使用来自li[1:] + li[:1]
的{{1}}或chain(li[1:],li[:1])
与chain
。
或者,您可以使用itertools
模块中的另外两个帮助程序:
itertools
不会创建额外的列表。
答案 2 :(得分:1)
您可以定义自己的生成器函数looper
,然后遍历它返回的生成器。生成器函数将列表作为第一个参数,将所需的起始索引作为第二个输入。模运算符(%
)可以将索引保持在列表的边界内。
def looper(my_list, starting_ix):
len_ml = len(my_list)
for i in range(starting_ix, len_ml + starting_ix):
yield my_list[i % len_ml]
li = ['a', 'b', 'c', 'd']
for item in looper(li, 1):
print item
答案 3 :(得分:1)
这是怎么回事?
在列表后追加列表,并将start_index
重复到start_index+len(list)
。
ary = [1,2,3,4,5]
start_idx = 3
for num in (ary+ary)[start_idx:start_idx+len(ary)]:
print(num)
答案 4 :(得分:0)
虽然建议使用内置函数,但你仍然可以这样做。
回答关于迭代的问题(使用简单的索引操作):
li = ['a', 'b', 'c', 'd']
i_offset = 1
for i in range(len(li)):
print (li[(i+i_offset) % len(li)])
回答有关打印列表的问题(以更加pythonic的方式):
li = ['a', 'b', 'c', 'd']
i_offset = 1
print ([li[(i+i_offset) % len(li)] for i,x in enumerate(li)])
无需转换为队列并转换回列表即可实现它。