创造一个“蛇”柜台

时间:2017-05-13 19:08:08

标签: python python-3.x for-loop

我只是试图让逻辑直接并使用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

4 个答案:

答案 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]