【问题标题】:Sieve of Eratosthenes algorithm question (Python Syntax)埃拉托色尼筛算法题(Python语法)
【发布时间】:2011-08-02 10:06:55
【问题描述】:

所以我正在阅读关于 Eratosthenes 筛子的 Wikipedia 文章,其中包含一个 Python 实现: http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes#Algorithm_complexity_and_implementation

def eratosthenes_sieve(n):
    # Create a candidate list within which non-primes will be
    # marked as None; only candidates below sqrt(n) need be checked. 
    candidates = range(n+1)
    fin = int(n**0.5)

    # Loop over the candidates, marking out each multiple.
    for i in xrange(2, fin+1):
        if not candidates[i]:
            continue

        candidates[2*i::i] = [None] * (n//i - 1)

    # Filter out non-primes and return the list.
    return [i for i in candidates[2:] if i]

它看起来是一个非常简单和优雅的实现。我见过其他实现,即使是在 Python 中,我也了解 Sieve 的工作原理。但是这个实现的具体工作方式,我有点困惑。似乎写那个页面的人非常聪明。

我知道它遍历列表,找到素数,然后将多个素数标记为非素数。

但是这条线到底做了什么:

candidates[2*i::i] = [None] * (n//i - 1)

我已经弄清楚它从 2*i 到末尾的切片候选,按 i 迭代,这意味着 i 的所有倍数,从 2*i 开始,然后到 3*i,然后到 4*我直到你完成列表。

但是[None] * (n//i - 1) 是什么意思?为什么不直接将其设置为 False?

谢谢。一种只有一个答案的特定问题,但我认为这是提出问题的地方。我当然希望得到一个明确的解释。

【问题讨论】:

标签: python syntax wikipedia


【解决方案1】:
candidates[2*i::i] = [None] * (n//i - 1)

只是一种简洁的写法

for j in range(2 * i, n, i):
    candidates[j] = None

通过将Nones 的列表分配给candidates 的切片来工作。

【讨论】:

    【解决方案2】:

    L * N 创建并连接N(浅)L 的副本,因此[None] * (n//i - 1) 给出了ceil(n / i) 乘以None 的列表。切片分配 (L[start:end:step] = new_L) 用 new_L 的项目覆盖切片接触的列表中的项目。

    您是对的,也可以将项目设置为False - 我认为这会更好,代码的作者显然认为None 将是“划掉”的更好指标。但是None 也可以,因为bool(None) is False.. if i 本质上是if bool(i)

    【讨论】:

    • 我得到 None 和 if i,但我想知道的是,= None 和 = [None] * (n//i -1) 之间的真正区别是什么没有?您是否将多个数字连续设置为 false?我想您是用一个由多个 [none] 条目组成的新列表一次全部替换切片... = None 编译还是语法错误? (用 false 单独分配每个,而不是用集合替换集合)嗯必须试试这个......
    • @Zaphod:为简单起见,使用range(10) 的切片[::2]xs[::2] = None 引发TypeError: must assign iterable to extended slicexs[::2] = [None] * 6 按预期工作。所以,是的,只是 None 是行不通的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    相关资源
    最近更新 更多