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
.
Here's my attempt, but I absolutely know why it's wrong:
lst = [1] + [i for i in range(1,10)]
lst[1:10] = [lst[i-1] * i for i in range(1,10)]
print(lst)
Just for fun:
One-liner mega-hack using list comprehension and an auxiliary accumulator (the resulting list itself) to reuse previously computed value
s=[1]; s=[s[-1] for x in range(1,10) if not s.append(x*s[-1])]
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.