Reputation:
I want to create a python list comprehension statement that contains all the multiples of 2 to 100 that are under 100 and puts them inside a list. I understand this statement is probably very confusing so here how it would work in my mind:
I want to achieve this using list comprehension if possible. I've attached my work in the bottom which is not working. Right now, my loop just prints the multiple of 2 100 times and I am having trouble figuring out how to change the number being multiplied and storing it in one entire list.
Note: The point of my list is to filter out the prime numbers later, in the fashion of the Sieve of Eratosthenes but I don't need help with that part. See my code below:
print([i for i in range(100) if [x+x for x in range(100) if i + i <= 100]])
Upvotes: 0
Views: 773
Reputation: 4127
This is not an answer, just an observation about how list comprehension could be slower than a multiline program.
This program is an implementation of the Sieve of Eratosthenes. One line added to @Pranav's solution could eliminate running through the table with unnecessary divisors. e.g.
multiples = set()
for i in range(2, 101): # Loop over numbers
if not i in multiples:
for j in range(2, 100//i + 1): # Loop over multiplications
multiples.add(i * j)
I don't believe that could be done with any kind of list comprehension.
Upvotes: 1
Reputation: 25489
In my early days with Python I often found it helpful to write the operation as a regular loop first, and then converting it to a list comprehension
I'm going to use a set comprehension in my answer because sets get rid of the duplicates, so you don't have to worry about checking if a number is already in the list.
For example:
multiples = set()
for i in range(2, 101): # Loop over numbers
for j in range(2, 100//i + 1): # Loop over multiplications
multiples.add(i * j)
The inner loop goes from 2
(because you don't want to add every number to the set) to 100//ii + 1
(because 100//i
is the highest multiple of i
that is <= 100
, and + 1
because range()
excludes the end).
Writing this as a listset comprehension now is easy:
multiples = {i * j for i in range(2, 101) for j in range(2, 100//i + 1)}
To quickly pick out the numbers that aren't in this set, you can create a set containing all numbers from 2
(because 1
isn't prime) to 100
and get the set difference.
primes = set(range(2, 101)) - multiples
which gives:
{2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97}
Upvotes: 1