以编程方式创建Python交替范围



我正在寻找一种方便的方法来以

的形式创建有序的,交替的(负的,正的,同时从前一对递减和递增一个)整数列表
[-1, 1, -2, 2, -3, 3, -4, 4, -5, 5, -6, 6, -7, 7, -8, 8, -9, 9, -10, 10]

与Python的可变长度/结束整数,如:alternating_range(2) = [-1, 1, -2, 2]

我可以很容易地在"for循环"但我正在寻找一个更"python"的;

有两种可能的解决方案:

第一个使用列表推导式的:

def alternating(i : int) -> List[int]:
return [i * sign for i in range(1, i + 1) for sign in [1, -1]]

第二个使用numpy:

import numpy as np
def alternating(i : int) -> np.ndarray:
return np.c_[(r := np.arange(1, i)), -1 * r].reshape(-1)

你可以像这样做一个生成器:

def alternating_range(x):
return (i for j in range(1, x+1) for i in (-j,j))

然而,我认为for循环解决方案更具可读性。你引用"平"比"嵌"好。这个方案只有一级嵌套,而上面的方案有二级嵌套。

def alternating_range(x):
for i in range(1, x+1):
yield -i
yield i

这两个都返回生成器,您可以使用list(alternating_range(x))转换为列表。

为了好玩,使用尾部递归:

def alternating_range(i, n=-1, p=1, res=[]):
return res if i+1 == p else alternating_range(i, n-1, p+1, res+[n,p])
print(alternating_range(10))
# [-1, 1, -2, 2, -3, 3, -4, 4, -5, 5, -6, 6, -7, 7, -8, 8, -9, 9, -10, 10]

或while循环:

def alternating_range(i, n=-1, p=1, res=[]):
while p <= i: res += [n, p]; n, p = n-1, p+1
return res
print(alternating_range(10))
# [-1, 1, -2, 2, -3, 3, -4, 4, -5, 5, -6, 6, -7, 7, -8, 8, -9, 9, -10, 10]

我相信你想要一些花哨的东西,如果不是很有效的话,像这样:

def alternating_range(end):
return list(sum(map(lambda x: (x*-1, x), range(1, end+1)), ()))
print(alternating_range(10))

不需要导入,代码中没有明显的嵌套(for循环)

另一个(非常难看的)选项,使用列表推导,只有一个for语句是:

def alternating_range(n):
return [
(i + (i % 2) - int((i + 1) / 2)) * (-1)**i
for i in range(1, 2 * n + 1)
]

最新更新