我想创建一个python列表推导语句,其中包含所有小于100的2到100的倍数,并将它们放入列表中。我知道这句话可能很令人困惑,所以下面是它在我脑海中的工作方式:
- 从2开始,将2的所有倍数加到一个列表中。IE。2,4,6,8…100 . .
- 移动到下一个数字3,将所有3的倍数添加到同一列表(保持在100以下)IE。3、6、9、…99
- 对从2到99的所有数字重复此操作,将所有值放在一个单一列表中 最后,我的列表应该包含从1到100的所有非素数。
我想使用列表推导来实现这一点如果可能的话。我在底部附上了我的作品,它不起作用。现在,我的循环只是打印2的倍数100次,我很难弄清楚如何改变被乘的数字并将其存储在一个完整的列表中。
注:我的列表的重点是过滤掉质数,在埃拉托色尼的筛子的方式,但我不需要帮助的那部分。请看下面的代码:
print([i for i in range(100) if [x+x for x in range(100) if i + i <= 100]])
在我使用Python的早期,我经常发现首先将操作写成常规循环,然后将其转换为列表推导式是很有帮助的
我将在我的答案中使用set推导式,因为set会消除重复项,所以你不必担心检查一个数字是否已经在列表中。
例如:
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)
内循环从2
(因为您不想将每个数字都添加到集合中)到100//ii + 1
(因为100//i
是i
的最大倍数,即<= 100
,+ 1
,因为range()
不包括末尾)。
把这个写成列表集合理解现在很容易了:
multiples = {i * j for i in range(2, 101) for j in range(2, 100//i + 1)}
要快速挑选出不是的数字,您可以创建一个包含从2
(因为1
不是素数)到100
的所有数字的集合,并获得集合差值。
primes = set(range(2, 101)) - multiples
给了:
{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}
这不是一个答案,只是一个关于列表理解如何比多行程序慢的观察。
这个程序是埃拉托色尼筛的实现。在pranav的解决方案中添加一行可以避免在表格中运行不必要的除数。例如
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)
我不相信任何类型的列表推导都能做到这一点。