我有一个循环:
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,依此类推?
答案 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}}。
发电机(上图)是另一种方法。