[英]Change step value inside range function?
list1 = [1, 2, 3, 4]
我正在嘗試找出一種方法來更改每個打印的我的步長值
我試過的
r = 0
for i in range(0, 10, list1[r]):
print i
r = r + 1
我建議為此使用while
循環實現您自己的生成器。 例子 -
def varied_step_range(start,stop,stepiter):
step = iter(stepiter)
while start < stop:
yield start
start += next(step)
然后你可以使用它作為 -
for i in varied_step_range(start,stop,steplist):
#Do your logic.
我們執行step = iter(stepiter)
以便stepiter
可以是任何類型的可迭代對象。
演示 -
>>> def varied_step_range(start,stop,stepiter):
... step = iter(stepiter)
... while start < stop:
... yield start
... start += next(step)
...
>>> for i in varied_step_range(0,10,[1,2,3,4]):
... print i
...
0
1
3
6
考慮到您的評論,您想要的是:
>>> [range(0,10, i) for i in list1]
[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 2, 4, 6, 8], [0, 3, 6, 9], [0, 4, 8]]
更新:由於我們無法在迭代時更改range()
步驟:
>> for el in list1:
>>> print range(0, 10, el)
[*0*, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, *2*, 4, 6, 8]
[0, 3, *6*, 9]
[0, 4, 8] (?)
最后一個范圍沒有元素..
range 函數不支持此操作。 您必須明確地進行迭代。
for elem in list1:
i += elem
if i > 10:
break
print i
您必須遍歷步驟,而不是遍歷元素:
index = 0
for i in range(len(your_list)):
if (index+i)>=len(your_list):
break
else:
print your_list[index+i]
index = index + i
列表[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]
上的輸出:
1
2
4
7
11
16
列表["a","b","c","d","e","f","g","h","i"]
:
a
b
d
g
由於這些問題似乎一遍又一遍地出現,這里有一個更通用的解決方案:
class RangeBase:
def __iter__(self):
i = self.start
direction = 1 if self.step >= 0 else -1
while i * direction < self.stop * direction:
yield i
i += self.step
這個 mixin 類可以以多種方式使用:
class DynamicRange(RangeBase):
def __init__(self, start, stop, step=1):
self.start = start
self.stop = stop
self.step = step
class StepListRange(RangeBase):
def __init__(self, start, stop, steps):
self.start = start
self.stop = stop
self.steps = iter(steps)
@property
def step(self):
return next(self.steps)
讓我們測試一下:
>>> a = DynamicRange(1,111,2)
>>> b = iter(a)
>>> next(b)
1
>>> next(b)
3
>>> next(b)
5
>>> next(b)
7
>>> next(b)
9
>>> next(b)
11
>>> next(b)
13
>>> next(b)
15
>>> a.step=3
>>> next(b)
18
>>> next(b)
21
>>> next(b)
24
>>> next(b)
27
>>> next(b)
30
>>> next(b)
33
>>> next(b)
36
>>> next(b)
39
>>> next(b)
42
>>> next(b)
45
>>> a.step=30
>>> next(b)
75
>>> next(b)
105
>>> next(b)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
和
>>> a=StepListRange(1,100,[1,2,3,4,5,6,7,8,9,10,20,30,40])
>>> b=iter(a)
>>> next(b)
1
>>> next(b)
3
>>> next(b)
6
>>> next(b)
10
>>> next(b)
15
>>> next(b)
21
>>> next(b)
28
>>> next(b)
36
>>> next(b)
45
>>> next(b)
55
>>> next(b)
75
>>> next(b)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.