没有质数列表推导式

4 投票
3 回答
839 浏览
提问于 2025-04-18 10:34

我正在努力理解列表推导式,以及在Python中处理列表的操作。

从这个指南 http://www.secnetix.de/olli/Python/list_comprehensions.hawk 中,我还是搞不清楚第一行到底在干嘛。

>>> noprimes = [j for i in range(2, 8) for j in range(i*2, 50, i)]
>>> primes = [x for x in range(2, 50) if x not in noprimes]
>>> print primes
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]

所以我把这一行放到pythontutor上去可视化一下。这样我能看到,对于每一个i的值,j会依次变成(2,4)、(2,6)、(2,8),然后是(3,6)、(3,9)、(3,12)等等。但我就是无法用一句话准确地理解发生了什么。

让我掌握列表的用法是我遇到的最大障碍,这对我来说非常重要,但我就是无法弄明白,感觉不够“清晰”。

3 个回答

1

首先,它创建了一个叫做 noprimes 的列表,这个列表里是合成数,也就是不是质数的数字。i 的值从 2 到 7。当 i 是 2 的时候,j 会遍历 4、6、8 等等,也就是 2 的倍数,但不包括 2 本身。当 i 是 3 的时候,j 会是 6、9、12 等等。所以,最后 noprimes 里会包含所有小于等于 49 的合成数(有些数字可能出现多次)。

接着,primes 就是从 2 到 49 之间的所有数字中,去掉那些在 noprimes 列表里的数字,剩下的就是质数。

1
noprimes = [j for i in range(2, 8) for j in range(i*2, 50, i)]

这段话的意思是,这个东西和下面的内容是一样的:

noprimes = []
for i in range(2, 8):
    for j in range(i*2, 50, i):
        noprimes.append(j)
4

这一行

noprimes = [j for i in range(2, 8) for j in range(i*2, 50, i)]

等同于:

noprimes = []
for i in range(2,8):
   for j in range(i*2, 50, i):
     noprimes.append(j)

而这一行

primes = [x for x in range(2, 50) if x not in noprimes]

等同于:

primes=[]
for x in range(2,50): 
  if x not in noprimes: 
    primes.append(x)

更新,回应评论

这些行

   for j in range(i*2, 50, i):
     noprimes.append(j)

会生成一系列数字。起始数字是 2*i,每次增加的数字是 i,这个序列会在达到或超过 50 之前停止。

i = 2 时,它会生成数字序列 4 6 8 ... 48

i = 3 时,它会生成数字序列 6 9 12 ... 48

等等。

整个循环会生成以下数字

4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48,
6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48,
8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48,
10, 15, 20, 25, 30, 35, 40, 45,
12, 18, 24, 30, 36, 42, 48,
14, 21, 28, 35, 42, 49

撰写回答