以x步循环一个范围?

时间:2017-02-08 22:24:27

标签: python for-loop

我有一个圆的半径和等式y = int(math.sqrt(pow(radius, 2)-pow(i,2)))(毕达哥拉斯) 现在我想在16个步骤的多个步骤中遍历范围range(-radius,0) + range(1, radius+1),如下所示:

radius = 4
Actually output: -4, -3, -2, 1, 1, 2, 3, 4
What I want: -4, -3.5, -3, -2.5, -2, -1.5, -1, -0.5, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4

我发现,你不能轻易改变for循环的步长,但我找到了一种方法:

print("Length: ", len([x/2 for x in chain(range(-2*radius, 0), range(1,2*radius+1))]))
print("Values: ", [x/2 for x in chain(range(-2*radius, 0), range(1,2*radius+1))])

如上所述,返回16和想要的“计数”。

现在我的问题是:我该如何实现自动化?因为它与4一起工作只是一个“巧合”,并且例如radius = 5它不会像这样工作。那么有一个解决方案,我可以在x步骤中循环一个范围吗?

4 个答案:

答案 0 :(得分:1)

解决方案1.1:

您可以使用linspace - 函数,然后选择那些非0的值。这可以通过以下代码中的my_range - 函数来完成:

import numpy as np

def my_range(radius, steps):
    ran = np.linspace(-radius, radius, steps+1)
    return ran[np.nonzero(ran)]

现在,

[i for i in my_range(4, 16)]

产生

[-4.0, -3.5, -3.0, -2.5, -2.0, -1.5, -1.0, -0.5, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0]

解决方案1.2:

可替换地,

list(my_range(4, 16))

生成相同的列表。

解决方案2:

如果你不想定义一个函数,这里有一个简洁的方法来实现同样的事情:

[i for i in np.linspace(-4, 4, 16+1) if i != 0]

答案 1 :(得分:0)

希望您喜欢这个解决方案,__future__导入适用于python 2.x:

from __future__ import division
r = 4
result = [-a/2 for a in xrange(1, r*2+1)][::-1] + [a/2 for a in xrange(1, r*2+1)]
print result

答案 2 :(得分:0)

看起来你想要+/-限制相等的幅度

然后您可以选择在范围内包含端点,如果那样,那么您希望获得n + 1分

纯python,没有导入:

a16 = np.arange(15, dtype=np.int16)
b8 = np.array([4,19], dtype=np.int8)
ab8 = np.r_[b8, a16.view(np.int8)]
# verify
np.alltrue(a16 == ab8.view(np.int16)[1:])

lim, n = 3, 10

[-lim + i * 2 * lim / (n - 1) for i in range(n)]
Out[27]: 
[-3.0,
 -2.3333333333333335,
 -1.6666666666666667,
 -1.0,
 -0.3333333333333335,
 0.3333333333333335,
 1.0,
 1.666666666666667,
 2.333333333333333,
 3.0]

将列表理解方括号更改为圆形会生成一个可用于代替range()的生成器

答案 3 :(得分:-1)

范围函数有三个参数start,stop和step(第三个参数是可选的)。 range(-4,4,0.5)将解决您的问题。 所以让我们假设-x开始,x停止。

step =  int(x/16);
range(-x, x, step);