使用列表推导创建因子列表

时间:2016-12-09 14:27:04

标签: python list-comprehension

我试图建立前十个因子列表

[1,1,2,6,24,120,720,5040,40320,362880]

仅使用列表理解。这可能吗?

我不知道发电机或lambda

这是我的尝试,但我完全知道为什么它错了:

lst = [1] + [i for i in range(1,10)]
lst[1:10] = [lst[i-1] * i for i in range(1,10)]
print(lst)

4 个答案:

答案 0 :(得分:4)

您可以使用math.factorial()

import math

[math.factorial(n) for n in range(10)]

<强>输出:

>>> import math
>>> 
>>> [math.factorial(n) for n in range(10)]
[1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880]

答案 1 :(得分:3)

只是为了好玩:

使用列表理解和辅助累加器重新使用先前计算值的单行超级黑客

s=[];  s=[s[-1] for x in range(1,10) if not aux.append(x*s[-1] if aux else 1)]

结果:

[1, 2, 6, 24, 120, 720, 5040, 40320, 362880]

注意:math.factorial答案是元素随机的方式。这里更快,因为我们可以重复使用以前的结果。

还有另一个缺点:需要将所有元素存储在list中,因为python不允许if和C之类的赋值。因此,我们必须附加到列表中并否定它返回的None,因此if测试为True

正如我所说:有趣,但仍然是黑客。

答案 2 :(得分:2)

您的尝试不起作用,因为列表理解在元素方面有效,您不能像这样引用lst[i-1]factorial模块中有一个math函数,但是,由于您提到了生成器,您可以使用这样的函数

def mygenerator():
    total = 1
    current = 1
    while True:
        total *= current
        yield total
        current += 1

factorial = mygenerator()
output = [next(factorial) for i in range(10)]

答案 3 :(得分:1)

我们也可以使用我们自己的函数但是嘿,理解列表的含义有点丢失,但它仍然是函数

def factorialIte(n):
  factorial = 1
  for i in range(1,n+1):
    factorial = factorial*i
return factorial
# 10 is n_max
[factorialIte(n) for n in range(1,11)]
>>[1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800]