我正在寻找一种方便的方法来以
的形式创建有序的,交替的(负的,正的,同时从前一对递减和递增一个)整数列表[-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)
]