1

如何通过 for 循环传递列表中的所有项目。如果迭代不是从第一个元素开始。

让我们立即跳到示例:

我们有清单 ['a','b','c','d']

我想使用 for 循环浏览此列表中的所有项目。但是如果迭代不是从第一个元素开始,我想回来并从第一个元素开始。像这样的东西:

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

start_index = 2

for loop_num in range(len(lst)):
    item = lst[start_index+loop_num]
    print item

它会打印我:

>> c,d

比上升IndexOutOfRange 错误

但我希望结果是这样的:

>> c, d, a, b

如果我们将start_index变量更改为1result 假设是:

b, c, d, a

的情况下start_index = 0

结果: a, b, c, d

4

5 回答 5

5
lst = ['a','b','c','d']

start_index = 2

for loop_num in range(len(lst)):
    item = lst[(start_index+loop_num) % len(lst)]
    print item

% - 这是特殊操作。3 % 5 = 3, 10 % 5 = 0,阅读剩余部分Python 文档

于 2012-05-11T17:30:20.663 回答
4

Python

>>> l = ['a','b','c','d']
>>> def func(lst, idx=0):
...     for i in lst[idx:] + lst[:idx]: yield i
...
>>> list(func(l))
['a', 'b', 'c', 'd']
>>> list(func(l,2))
['c', 'd', 'a', 'b']
>>>

使用标准 Python 列表切片语法、一个可选参数 ( idx) 和一个生成器

于 2012-05-11T17:29:30.537 回答
2

我会用 C# 来回答。假设我们有一个大小为 x 的数组(更容易显示)。起始索引为 y,小于 x,但大于 0。

int i;
for(i=y;i<x;i++)
{
  //do something with MyArray[i]¸
  if(i==x)
  {
    for(i=0;i<y;i++)
    {
      //do something with MyArray[i]
    }
    i=x;
  }
}
于 2012-05-11T17:33:11.787 回答
2

您可以使用%获取正确的索引:

def rotated(lst, start=0):
    c = len(lst)
    for idx in xrange(c):
        yield lst[(idx + start) % c]


for x in rotated(['a','b','c','d'], 2):
    print x,
于 2012-05-11T17:32:18.600 回答
1

在 Ruby 数组中有一个名为的方法values_at,它接受一个索引或一个索引范围(组合,任意数量)。for循环很少使用——这是我写的第一个。

lst = ['a','b','c','d']
start_index = 2

for v in lst.values_at(start_index..-1, 0...start_index)
  puts v
end
于 2012-05-13T20:53:47.960 回答