【问题标题】:Does append() function add both index and value to another list?append() 函数是否将索引和值都添加到另一个列表?
【发布时间】:2019-10-08 19:04:09
【问题描述】:

这是我想要理解的代码:

代码是 Erastothenes 筛法的实现。如果我理解正确,那么直到第 8 行,代码会创建一个最多为 N 的素数列表,该列表是一个布尔列表,其中 True - prime; False - 非素数;并且索引号与我们输出的数字匹配。

我的问题是: 对于第 9-13 行,脚本是否使用新列表中的索引和布尔值“重写”素数(它们只是 True 值),以便我们在最后打印它们? 另外,如果 primes 是一个布尔列表,为什么 python 在末尾打印索引值而不是一堆 True 参数?

更新:我知道了,谢谢大家! range 是一组从 2 - n+1 的整数,因此 i 也是整数,这就是我在素数字符串中得到整数的原因。出于某种原因,我最初将 range 视为 list1

def sita(N):
    list1 = [True for _ in range(N + 1)]
    list1[0:1] = [False, False]
    for start in range(2, N + 1):
        if list1[start]:
            for i in range(2 * start, N + 1, start):
                list1[i] = False
    primes = []  #create empty list
    for i in range(2, N + 1):
        if list1[i]:
            primes.append(i)
    return primes
print(sita(int(input("Dati un numar N: "))))

【问题讨论】:

  • primes 不是布尔值列表。这就是第二个循环的全部要点。你能澄清一下“用索引和布尔值重写”的意思吗?
  • 我的意思是,它采用 True 的值并将它们重写到具有相同旧索引和值的新列表中

标签: python


【解决方案1】:

您的循环 for i in range(2, N + 1): 正在遍历实际索引。它测试 list1[i] 中的布尔值,但只存储索引。布尔值(list1[i])不需要写;您appended i 的事实表明测试通过,并且已知i 对应于质数。由于primes 是从头开始构建的,因此它根本不包含布尔值,只有在最终循环中添加到它的各种i 值(经过测试并发现素数)append

【讨论】:

    【解决方案2】:

    primes.append(i) 仅附加其参数i。没有魔法可以将其他任何内容附加到列表中。

    在您的代码中,有两个独立的列表:list1primes

    • 第一个包含每个非负整数的布尔值。

    • 第二个包含那些在第一个循环结束时list1 包含True 的整数(这是if list1[i] 检查所做的)。

    【讨论】:

      猜你喜欢
      • 2018-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-10
      • 1970-01-01
      • 2021-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多