我试图建立前十个因子列表
[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)
答案 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]