Skip to content Skip to sidebar Skip to footer

Create List Of Factorials Using List Comprehension

I'm trying to build a list of the first ten factorials [1,1,2,6,24,120,720,5040,40320,362880] using only list comprehension. Is that possible? I don't know generators or lambda.

Solution 1:

You can use math.factorial():

import math

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

Output:

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

Solution 2:

Just for fun:

One-liner mega-hack using list comprehension and an auxililary accumulator (the resulting list itself) to reuse previously computed value

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

result:

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

note: The math.factorial answer is the way when elements are random. Here it's faster because we can reuse previous results.

There's also another drawback: the need to store all elements in a list because python does not allow if and assignment like C does. So we have to append to a list and negate the None it returns so if test is True

As I said: fun, but still a hack.

Solution 3:

Your attempt does not work because the list comprehension works element-wise, you cannot refer to lst[i-1] like that. There is a factorial function in math module, however, since you mentioned generators, you can use one like this

defmygenerator():
    total = 1
    current = 1whileTrue:
        total *= current
        yield total
        current += 1

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

Solution 4:

We could also use our own function but hey, the meaning of the comprehension lists is lost a bit but it is still functional

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

Post a Comment for "Create List Of Factorials Using List Comprehension"