0

我正在寻找一种通用算法,它给定范围值start并将end生成一个数字列表,但数字必须经过零。. 这是我当前的代码:

end = 78
start = -1 * end
step_size = 16
numbers = range(start, end+step_size, step_size)

$ numbers
Out[90]: [-78, -62, -46, -30, -14, 2, 18, 34, 50, 66, 82]

所以在这种特殊情况下,我会从每个数字中减去 2,这样数字就有一个零值。但我怎么能更普遍地做到这一点?我这样做是为了计算图形的 y-tic 位置,因此我希望它们通过零一次。

4

2 回答 2

4

start % step_size应该是所需的偏移量:

>>> end = 78
>>> start = -1 * end
>>> step_size = 16
>>> range(start-(start%step_size), end+step_size, step_size)
[-80, -64, -48, -32, -16, 0, 16, 32, 48, 64, 80]

例子:

def get_range(end, step_size):
    start = -1 * end
    return range(start-(start%step_size), end+step_size, step_size)

>>> get_range(23, 4)
[-24, -20, -16, -12, -8, -4, 0, 4, 8, 12, 16, 20, 24]
>>> get_range(19, 11)
[-22, -11, 0, 11, 22]
>>> get_range(103, 32)
[-128, -96, -64, -32, 0, 32, 64, 96, 128]
于 2012-07-03T17:00:42.047 回答
0

找到列表绝对值的最小值,从列表的每个元素中减去它。这不是最佳的解决方案,但它又快又脏,而且有效:

(我使用 numpy 是因为它比列表更有效,如果你使用 matplotlib,你可能有 numpy)

>>> from numpy import *
>>> a = arange(-10, 20, 3)
>>> b = argmin([abs(_) for _ in a])
>>> a-=a[b]
>>> a
array([-9, -6, -3,  0,  3,  6,  9, 12, 15, 18])
于 2012-07-03T16:59:58.073 回答