从特定索引开始迭代所有Python列表值

时间:2017-06-11 15:11:45

标签: python list python-3.x indexing iteration

有没有办法循环Python列表中的所有值,但从特定索引开始?

例如:

li = ['a', 'b', 'c', 'd']

开始在索引1处循环并打印出结果。我的预期输出是:

['b', 'c', 'd', 'a']

我知道使用两个" for循环"能做到这一点,但有没有更好的方法呢?

5 个答案:

答案 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)])

无需转换为队列并转换回列表即可实现它。