生成这个数字序列的更清晰的方法是什么?

时间:2014-08-01 09:30:51

标签: python math

我必须生成一个这样的列表:

[0, 2, 6, 12, 20, 30, 42, 56, 72, 90]

这是我目前的代码

g = lambda x: x + g(x - 2) if x > 0 else 0
print([g(2 * i) for i in range(10)])

是否有更清晰,更直接的方法来生成序列?

3 个答案:

答案 0 :(得分:9)

这些似乎是前几个pronic numbers。也就是说,一个数字是两个连续整数n * (n + 1)的乘积。

sequence

我通过搜索OEIS找到了这个。使用列表解析生成它们很简单:

>>> [x*(x + 1) for x in range(10)]
[0, 2, 6, 12, 20, 30, 42, 56, 72, 90]

答案 1 :(得分:2)

正如@wim已经指出的那样,你的算法是“pronic数字”,可归纳为:

  

n - th pronic数是第一个n偶数整数的总和

因此您可以将其写为:

def pronic(n):
    """Create a list of the first n pronic numbers."""
    return [sum(range(0, 2*i+1, 2)) for i in range(n)]

然而,虽然这是你所采取的方法的明确实现,但另一个定义可以使它更整洁,正如@ wim的答案所示。

您还可以将实施视为生成器:

def pronic():
    """Generate the pronic numbers."""
    i = 0
    while True:
        yield i * (i + 1)
        i += 1

答案 2 :(得分:0)

list1 = [x+(x ** 2) for x in range(10)]
print list1

Output : [0, 2, 6, 12, 20, 30, 42, 56, 72, 90]

这将为您提供您所要求的系列。