Python 使用列表理解创建阶乘列表
我正试图建立一个前十个因子的列表Python 使用列表理解创建阶乘列表,python,list-comprehension,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) 您可以使用: 输出: >>> import math >>&g
[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)
您可以使用:
输出:
>>> import math
>>>
>>> [math.factorial(n) for n in range(10)]
[1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880]
您可以使用:
输出:
>>> import math
>>>
>>> [math.factorial(n) for n in range(10)]
[1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880]
您的尝试不起作用,因为列表理解在元素方面起作用,您不能像这样引用
lst[i-1]
。在math
模块中有一个factorial
函数,但是,由于您提到了生成器,您可以使用这样一个
def mygenerator():
total = 1
current = 1
while True:
total *= current
yield total
current += 1
factorial = mygenerator()
output = [next(factorial) for i in range(10)]
您的尝试不起作用,因为列表理解在元素方面起作用,您不能像这样引用
lst[i-1]
。在math
模块中有一个factorial
函数,但是,由于您提到了生成器,您可以使用这样一个
def mygenerator():
total = 1
current = 1
while True:
total *= current
yield total
current += 1
factorial = mygenerator()
output = [next(factorial) for i in range(10)]
只是为了好玩:
一个使用列表理解和辅助累加器(生成的列表本身)的线性mega hack可以重用以前计算的值
s=[]; s=[s[-1] for x in range(1,10) if not s.append(x*s[-1] if s else 1)]
结果:
[1, 2, 6, 24, 120, 720, 5040, 40320, 362880]
注意:math.factorial
答案是元素随机时的答案。这里速度更快,因为我们可以重用以前的结果
还有另一个缺点:需要将所有元素存储在列表中,因为python不允许if
和赋值,就像C一样。因此,我们必须附加到一个列表中,并否定None
,如果test为True
正如我所说:很有趣,但仍然是一个黑客。只是为了好玩:
一个使用列表理解和辅助累加器(生成的列表本身)的线性mega hack可以重用以前计算的值
s=[]; s=[s[-1] for x in range(1,10) if not s.append(x*s[-1] if s else 1)]
结果:
[1, 2, 6, 24, 120, 720, 5040, 40320, 362880]
注意:math.factorial
答案是元素随机时的答案。这里速度更快,因为我们可以重用以前的结果
还有另一个缺点:需要将所有元素存储在列表中,因为python不允许if
和赋值,就像C一样。因此,我们必须附加到一个列表中,并否定None
,如果test为True
正如我所说:很有趣,但仍然是一种技巧。我们也可以使用我们自己的功能,但是,嘿,理解列表的含义丢失了一点,但它仍然是功能性的
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]
我们也可以使用我们自己的函数,但是,嘿,理解列表的含义丢失了一点,但它仍然是功能性的
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]
我建议显示一些尝试编写一个函数来计算数字的阶乘(def fact(n):…return res
),然后使用一个列表理解,如:[fact(x)for x in range(10)]
@Ev.Kounis可能OP要求我们给他写一个不使用任何函数的列表理解;)我建议显示一些尝试编写一个函数来计算数字的阶乘(def fact(n):…return res
),然后使用一个列表理解,如:[fact(x)for x in range(10)]
@Ev.Kounis可能OP要求我们给他写一个不使用任何函数的列表理解;)是的,Python附带了电池:)虽然这非常简洁,但计算n
的大值可能要慢得多,因为每次调用math.factorial(n)
都会重新计算0的所有中间值!到(n-1)!每次调用它。是的,Python都附带电池:)虽然这非常简洁,但计算n
的大值可能要慢得多,因为每次调用math.factorial(n)
都会重新计算0的所有中间值!到(n-1)!每次调用它。这个时间友好吗?是的,与递归解决方案相反。它不会重新计算值。它给出了高达500的阶乘!不到一秒钟。使用递归解决方案,您无法达到20@AkinjideBankole此解决方案计算n使用(n-1)代码>已经计算过,不会再次执行。所以,是的。对于大n值,内置的math.factorial()
对时间更友好,这应该更快?是的,与递归解决方案相比。它不会重新计算值。它给出了高达500的阶乘!不到一秒钟。使用递归解决方案,您无法达到20@AkinjideBankole此解决方案计算n使用(n-1)代码>已经计算过,不会再次执行。所以,是的。内置的math.factorial()
用于大n值应该更快这也是我的想法☺. 3.只有2个!*3和2!是列表中到目前为止的最后一个元素,为3!即将进行计算。这并不需要同时使用aux
和s
变量,只需以这种方式编写第二部分:aux=[aux[-1]对于范围(1,10)内的x,如果没有…
或仅使用s
:)这也是我的想法☺. 3!只是2!*3和2!是到目前为止,当3!即将被计算时列表上的最后一个元素。这实际上并不需要aux
和s
变量,只需这样写第二部分:aux=[aux[-1]表示范围内的x(1,10),如果没有…
,或者只使用s
:)