+ 3

# is it possible? list comprehension for primes

Dear fellow learners, I currently go through the "more types| 6/9 list comprehension" module and i was wondering if you could make a list full of primes. The problem, that i ran into, is that I think you need a second variable for it in order to work. This is what I came up with. primes=[i == i for i in range(20) if i % x > 0 for x in range(20)] However, it produces: UnboundLocalError: local variable 'x' referenced before assignment. Any ideas? I'm not very experienced and grateful for every suggestion. Thank you

11 ответов

+ 12

I just came up with this
primes = [i for i in range(2,100) if all(i%x != 0 for x in range(2,i))]
It works but I'm not sure if I can explain how lol 🤣

+ 11

HonFu Hahahah the devil is in the details I guess 😅 and yes, math is really important, mostly in more complex algorithms.
Don't worry, though -- everything you learn accumulates over time, and that's what makes this app so great! Learning is an ability with no limitations and each person has their own path.
The community here at SL is full of supportive people and I love seeing the desire to learn in others. We all help each other improve! 😊

+ 11

HonFu The code playground here in SL works in mysterious ways 😂
One thing I'd like to point out (but I'm not 100% sure if I'm right): calculating the sqrt and storing it in a variable, then using the variable in the `range` function is probably more efficient. Because then the calculation is done only once and is reused from the variable.
I'm not sure how the `range` function works internally, but it happens with `for` loops on C-like languages. The calculation of the stop condition keeps on being made at every iteration of the loop and that slows the code down!

+ 10

HonFu In fact, it'd be even better to check up to `int(i**0.5)+1`, but I wasn't concerned with optimization.

+ 9

HonFu int(i**0.5) != i//2
`i**0.5` is the square root of `i`.
When checking if a number is prime, it is enough to check up to the square root of the number. 👍🏻😁
Doing this lowers the time complexity to O(n^(1/2)), which is a nice improvement.

+ 5

You can also use filter with lambda with Eduardo Petry's way
print(list(filter(lambda x: all(x%i != 0 for i in range(2, x)), range(2,100))))

+ 3

Aaaah ... damn, I think I always read int(i*0.5)+1!
(I still do that with '=' and '==', too, I think it's my most frequent SyntaxError.)
Interesting, I didn't know about the square root method; almost every day here on sololearn I experience how a lack of math skill negatively impacts my coding.
It's a good thing I came here so you can all help me out with improving on that! :)

+ 2

Eduardo Petry, would it be quicker if you wrote 'i//2+1' in the end?
I think you don't need to check further, right?

+ 2

Eduardo Petry, I always wanted to ask why people were using the int(i**0.5) syntax.
Can you explain why it would be better? If you need an int anyway, why not go with floor div from the start? (Sorry for the OT.)

+ 2

I just compared the two methods with time.process_time, and the sqrt way was clearly quicker.
Nevertheless, when I increased the range, the point of 'Time limit exceeded' was exactly the same!
*scratches head*

+ 1

I made a code to find a chosen amount of primes in an efficiënt way. idk if it helps but here you go.
https://code.sololearn.com/cXP80RNTKJOs/?ref=app