python - 创建一个包含 1 到 100 的所有倍数且小于 100 的 python 循环/列表理解
问题描述
我想创建一个 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 时,我经常发现先将操作编写为常规循环,然后将其转换为列表推导式会很有帮助
我将在我的答案中使用集合推导,因为集合消除了重复项,因此您不必担心检查一个数字是否已经在列表中。
例如:
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}