是否有可能在循环中有不稳定的步骤?

时间:2015-09-22 15:10:19

标签: python list loops for-loop range

我有一个循环:

result = []
list = ['a', 'b', 'c', 'd', 'e', 'f']
start = 2
step = 5
end = start + step*len(list)
for i in range(start, end, step):
    result.append(list[i%len(list)])
print result

在这种情况下,结果将是:

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

但是,让我们说,我希望结果是(将起始索引更改为1):

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

如何在每个循环后进行步骤更改,以便在第一个循环中步骤为5,在下一个循环中它再次为3然后再为5,依此类推?

4 个答案:

答案 0 :(得分:3)

你可以为这类事情编写自己的生成器:

from itertools import cycle
def super_range(start, stop, steps):
    csteps = cycle(steps)
    val = start
    while val < stop:
        yield val
        val += next(csteps)

用法看起来像:

for i in super_range(start, end, (5, 3)):
    result.append(list[i%len(list)])

答案 1 :(得分:1)

一个非常简单的解决方案是使用单独的变量来指示从列表中获取的索引,并根据您的步骤手动增加该索引。示例 -

lst = ['a', 'b', 'c', 'd', 'e', 'f']
i = 1
new_lst = []
for j in range(len(lst)):
    new_lst.append(lst[i%len(lst)])
    if j%2 == 0:
            i += 5
    else:
            i += 3

演示 -

>>> lst = ['a', 'b', 'c', 'd', 'e', 'f']
>>> i = 1
>>> new_lst = []
>>> for j in range(len(lst)):
...     new_lst.append(lst[i%len(lst)])
...     if j%2 == 0:
...             i += 5
...     else:
...             i += 3
...
>>> new_lst
['b', 'a', 'd', 'c', 'f', 'e']

此外,您不应将list用作变量名称,它会影响内置函数list,这意味着在定义list变量后,您将无法使用内置函数list()

答案 2 :(得分:1)

根据你想要做的而不是迭代和改变你可以使用的步骤和python内置函数或itertools模块。在这种情况下,您可以起诉zip函数和iterools.chain

>>> list(chain.from_iterable((j,i) for i,j in zip(li[0::2],li[1::2])))
['b', 'a', 'd', 'c', 'f', 'e']

在其他情况下,您可能需要使用某些功能,例如itertools.islice()zip_longest

答案 3 :(得分:0)

它是while循环而不是for循环吗?即一个当你不知道循环周围会有多少次旅行时,但是有充分的理由相信某些东西会终止循环。大纲代码:

i, inc, newlst = 1, 2, []
while i < len(lst) and i >= 0:
  newlst.append( lst[i] )
  # if some_condition: inc = some_new_value
  i += inc

类似的结构使用内置while True的{​​{1}}。

发电机(上图)是另一种方法。