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

迭代从特定索引开始的所有Python列表值,python,list,python-3.x,indexing,iteration,Python,List,Python 3.x,Indexing,Iteration,有没有一种方法可以循环一个Python列表中的所有值,但从一个特定的索引开始 例如: li = ['a', 'b', 'c', 'd'] 从索引1开始循环并打印结果。我的预期产出是: ['b', 'c', 'd', 'a'] 我知道使用两个“for循环”可以完成这项工作,但是有更好的方法吗?尽管使用内置函数是推荐的方法,但您仍然可以自己这样做 要回答有关迭代的问题(使用简单的索引操作),请执行以下操作: 要回答有关打印列表的问题,请(以更为通俗的方式): 无需转换为队列并转换回列表即可实现此

有没有一种方法可以循环一个Python列表中的所有值,但从一个特定的索引开始

例如:

li = ['a', 'b', 'c', 'd']
从索引1开始循环并打印结果。我的预期产出是:

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

我知道使用两个“for循环”可以完成这项工作,但是有更好的方法吗?

尽管使用内置函数是推荐的方法,但您仍然可以自己这样做

要回答有关迭代的问题(使用简单的索引操作),请执行以下操作:

要回答有关打印列表的问题,请(以更为通俗的方式):


无需转换为队列并转换回列表即可实现此功能。

虽然建议使用内置函数,但您仍然可以自己这样做

要回答有关迭代的问题(使用简单的索引操作),请执行以下操作:

要回答有关打印列表的问题,请(以更为通俗的方式):


无需转换为队列并转换回列表即可实现此功能。

您可以通过切片来实现:

l2 = [*li[1:], *li[:1]]
for i in l2:
    print(i)
适用于Pythons>=
3.5
。对于之前的版本,您可以使用
li[1:]+li[:1]
chain(li[1:],li[:1])
itertools
中的
chain

或者,使用
itertools
模块中的两个其他帮助程序,您可以执行以下操作:

# call list on it if you need a list object
it = islice(cycle(li), 1, len(li)+1)    
for i in it:
    print(i)

它不会创建额外的列表。

您可以通过切片来实现这一点:

l2 = [*li[1:], *li[:1]]
for i in l2:
    print(i)
适用于Pythons>=
3.5
。对于之前的版本,您可以使用
li[1:]+li[:1]
chain(li[1:],li[:1])
itertools
中的
chain

或者,使用
itertools
模块中的两个其他帮助程序,您可以执行以下操作:

# call list on it if you need a list object
it = islice(cycle(li), 1, len(li)+1)    
for i in it:
    print(i)

它不会创建额外的列表。

好吧,您可以使用内置类,它支持:

如果您真的想得到一个列表,您可以随时将其转换回:

>>> list(li)
['b', 'c', 'd', 'a']

您可以使用内置类,它支持:

如果您真的想得到一个列表,您可以随时将其转换回:

>>> list(li)
['b', 'c', 'd', 'a']

您可以定义自己的生成器函数
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

您可以定义自己的生成器函数
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
这个怎么样

在列表之后追加列表,并迭代
start\u index
start\u index+len(列表)

这个怎么样

在列表之后追加列表,并迭代
start\u index
start\u index+len(列表)



对于i-in-li[1:]+li[:1]:print(i)适用于任何版本的python,是我最简单的解决方案。对于i-in-li[1:]+li[:1]:print(i)适用于任何版本的python,是我最简单的解决方案。列表有多大?列表有多大?您是对的,
deque
不需要解决问题,但它是内置的(因此每个人都可以访问它)而且它本身就支持旋转。因此,即使不需要使用它,也可以使代码更容易(可能)更快。请注意,将其转换回完全是可选的(如果这不明显,我可以在我的回答中更清楚地说明),当涉及到迭代时,
deque
本身就像一个列表。我也很高兴你编辑了你的答案,现在它实际上解决了问题。:)还要注意,这个问题被标记为python-3.x,所以你可能应该在
打印
中添加括号(
()
)。谢谢@MSeifert的输入,我编辑了我的答案。您的答案确实很有趣,因此它显示了一个很好的Python特性,当内置函数变得更容易时,这是使用内置函数的好方法。我认为它不会更快,因为Python文档提到了
deque
将所有元素附加到新对象中。关于我的第一个答案,你是对的,我不应该这么晚才这么做:)我知道
deque
更快。在我对你的答案发表评论之前,我对它进行了计时。:)你是对的,deque不一定要解决这个问题,但是它是内置的(所以每个人都可以访问它),而且它本身就支持旋转。因此,即使没有必要使用它,也会使代码更容易(可能)更快。请注意,将其转换回完全是可选的(如果这不明显,我可以在我的回答中更清楚地说明),当涉及到迭代时,
deque
本身就像一个列表。我也很高兴你编辑了你的答案,现在它实际上解决了问题。:)另外请注意,该问题已标记为python-3.x,因此您可能应该在
打印
s中添加括号(
()
)。您的答案确实很有趣,因此它显示了一个很好的Python特性,当内置函数变得更容易时,这是使用内置函数的好方法。我认为它不会更快,因为Python文档提到了
deque
将所有元素附加到新对象中。关于我的第一个答案,你是对的,我不应该这么晚才这么做:)我知道
deque
更快。在我对你的答案发表评论之前,我对它进行了计时。:)您忘记了在
start\u idx+len(ari)
之后关闭
]
。另外,“在列表之后追加列表”也被称为“连接”(只是为了澄清——我想每个人都知道你的意思)我会修正我的答案打字错误。我英语不好,希望你能理解。你把它插错地方了:应该是
[sta]