创建一个python循环/列表推导式,其中包含1到100的所有小于100的倍数



我想创建一个python列表推导语句,其中包含所有小于100的2到100的倍数,并将它们放入列表中。我知道这句话可能很令人困惑,所以下面是它在我脑海中的工作方式:

  1. 从2开始,将2的所有倍数加到一个列表中。IE。2,4,6,8…100 . .
  2. 移动到下一个数字3,将所有3的倍数添加到同一列表(保持在100以下)IE。3、6、9、…99
  3. 对从2到99的所有数字重复此操作,将所有值放在一个单一列表中
  4. 最后,我的列表应该包含从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//ii的最大倍数,即<= 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)

我不相信任何类型的列表推导都能做到这一点。

相关内容

  • 没有找到相关文章

最新更新