我只是试图让逻辑直接并使用Python来帮助我做到这一点。最终,我需要使用ImageJ宏语言来解决这个问题。
我不知道我是否使用了正确的术语,但我想创建一个“蛇”计数器。
x = 1
number = 12
maxVal = 3
minVal = 1
for i in xrange(number):
%do something
x = incrementSnakeCounter(x, maxVal, minVal)
print("i = ", i)
print("x = ", x)
“蛇”部分使计数器仅上升到maxVal
,在下一次迭代中重复该数字,倒计时到minVal
,在下一次迭代时重复该值,并且重复这个过程。
例如,在上面的
中我希望发生以下情况:
i = 0
x = 1
i = 1
x = 2
i = 2
x = 3
i = 3
x = 3
i = 4
x = 2
i = 5
x = 1
i = 6
x = 1
i = 7
x = 2
i = 8
x = 3
i = 9
x = 3
i = 10
x = 2
i = 11
x = 1
答案 0 :(得分:4)
您会在itertools
中找到一些有用的工具:
from itertools import chain, cycle
def snake(lower, upper):
return cycle(chain(range(lower, upper+1), range(upper, lower-1, -1)))
> s = snake(1,3)
> [next(s) for _ in range(10)]
[1, 2, 3, 3, 2, 1, 1, 2, 3, 3]
答案 1 :(得分:1)
添加条件以确定x是否应该在循环内的任何给定点增加或减少。
x = 1
number = 12
maxVal = 3
minVal = 1
for i in xrange(number):
%do something
if(xIsIncreasing)
x = incrementSnakeCounter(x, maxVal, minVal)
else
x = decrementSnakeCounter(x, maxVal, minVal)
print("i = ", i)
print("x = ", x)
然后在incrementSnakeCounter()内部,当x == maxVal时,将xIsIncreasing的值更改为false,并且当x == minVal时,将decrementSnakeCounter()内部的值更改为true(您必须做一些工作以确保您&& #39;连续两次保持相同的价值,我现在没有时间为你解决这个问题。)
答案 2 :(得分:1)
您可以编写一个小型自定义生成器。
关键是要创建一个要重复的模式列表[1, 2, 3, 3, 2, 1]
,然后使用长度的模数对其进行索引以获得重复行为:
def snake(x, max_v=3, min_v=1):
cnt=0
sn=list(range(min_v, max_v+1,1))+list(range(max_v, min_v-1,-1))
while cnt<x:
yield cnt, sn[cnt%len(sn)]
cnt+=1
然后:
for i,x in snake(12):
print("i=",i)
print("x=",x)
print()
打印:
i= 0
x= 1
i= 1
x= 2
i= 2
x= 3
i= 3
x= 3
i= 4
x= 2
i= 5
x= 1
i= 6
x= 1
i= 7
x= 2
i= 8
x= 3
i= 9
x= 3
i= 10
x= 2
i= 11
x= 1
答案 3 :(得分:1)
这是一个愚蠢的数学解决方案:
def snake(low, high, x):
k = (high-low+1)
return k - int(abs(x % (2*k) + low - k - 0.5))
[snake.snake(1,3,x) for x in range(8)]
[1, 2, 3, 3, 2, 1, 1, 2]