Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有没有一种形式的';对于';这评估了;“表达式列表”;每一次?_Python_Python 3.x_For Loop - Fatal编程技术网

Python 有没有一种形式的';对于';这评估了;“表达式列表”;每一次?

Python 有没有一种形式的';对于';这评估了;“表达式列表”;每一次?,python,python-3.x,for-loop,Python,Python 3.x,For Loop,如果您不需要上下文: 如何重新运行相同的目标列表值,或者使用除for以外的其他方法,以便在每次迭代中读取表达式列表 如果您需要上下文: 我目前正在创建一个程序,列出从2到给定值(lt)的素数。我有一个“剩余”列表,从2到给定值的所有整数开始。一次一个,它测试列表“c”上的一个值,并测试列表“t”上所有较小数字的整除性。如果“c”可被“t”整除,则将其从列表中删除。理论上,到程序结束时,只剩下素数了,但我遇到了一个问题,因为我从列表中删除了项,并且只读取了剩余的一次,因此跳过了剩余中的值,从而在列

如果您不需要上下文:

如何重新运行相同的目标列表值,或者使用除for以外的其他方法,以便在每次迭代中读取表达式列表

如果您需要上下文:

我目前正在创建一个程序,列出从2到给定值(lt)的素数。我有一个“剩余”列表,从2到给定值的所有整数开始。一次一个,它测试列表“c”上的一个值,并测试列表“t”上所有较小数字的整除性。如果“c”可被“t”整除,则将其从列表中删除。理论上,到程序结束时,只剩下素数了,但我遇到了一个问题,因为我从列表中删除了项,并且只读取了剩余的一次,因此跳过了剩余中的值,从而在列表中留下了复合项。

(在下文中,我忽略了使用“mutable
for
”查找素数的过程。)

当序列被修改时,在序列上设计一个具有定义良好(且有效)行为的迭代并不完全是琐碎的。在您的情况下,如果序列只是被耗尽,一个合理的做法是使用一个列表,但通过用一个特殊值替换它们来“删除”元素。(这样可以很容易地保留当前迭代位置,并避免移动后续元素的成本。)


为了有效地跳过已删除的元素(对于外部迭代和任何内部迭代,如您的示例中所示),特殊值应该是(或包含)以下任何已删除元素的计数。请注意,删除当前元素有一种特殊情况,为了获得最大的效率,您必须在仍然知道要移动多远的情况下移动光标。

您试图做的几乎从来都不是正确的答案(这里肯定不是正确的答案,原因我将在后面介绍),这就是为什么Python没有给你一种自动完成的方法。事实上,在迭代列表时从列表中删除或插入列表是非法的,即使CPython和其他Python实现通常不检查该错误

但是有一种方法你可以模拟你想要的,只需要一点冗长:

lt = 1000 #list primes to ...
remaining = list(range(2, lt + 1)) #remaining primes

for c in remaining: #current "prime" being tested
    for t in remaining[0: remaining.index(c)]: #test divisor
        if c % t == 0 and c != t:
            if c in remaining:
                remaining.remove(c)
现在我们不是迭代剩余的,而是迭代它的索引。因此,如果我们删除值,我们将迭代修改列表的索引。(当然,我们并不真正依赖于
范围,因为
if…break
测试相同的东西;如果您更喜欢itertools.count()中的i
,这也会起作用。)

而且,根据您想做什么,您可以用不同的方式进行扩展,例如:

for i in range(remaining.index(c)):
    if i >= remaining.index(c): break
    t = remaining[i]
……等等


然而,正如我在顶部提到的,这并不是你想要做的。如果你看一下你的代码,它不仅在循环所有小于
c
的素数,它还在循环中调用一系列函数,这些函数也在循环所有小于
c
的素数或整个列表(这就是
索引
删除
,以及
中的
如何在列表中工作),这意味着你要把线性功变成二次功

解决这个问题的最简单方法是停止尝试对原始列表进行变异以删除复合数,而是在进行过程中构建一组素数。您可以在固定时间内从集合中搜索、添加和删除。你可以用显而易见的方式迭代你的列表,因为你不再对它进行变异



最后,这实际上并不是实现一个合适的素筛,而是一个效率低得多的算法,出于某种原因,几十年来每个人都在作为一个Scheme示例进行教学,最近又翻译成其他语言。有关详细信息,请参阅,或者查看Python和Ruby中的示例代码,其中显示了如何实现适当的筛选,以及一些关于性能权衡的注释。

您试图做的事情并不直接可行,主要是因为它几乎总是错误的设计。你可以用一点冗长来模拟它,只要在itertools.count()中为i做一个
而为True:
就行了。count():
使用
如果i>len(剩余):在循环开始时中断
,然后使用
剩余[i]
代替
c
。另外,如果你正在调用
列表。在循环中删除
,这几乎总是一个迹象,表明你要么没有跟踪你应该跟踪的索引,要么没有使用正确的算法。每个
remove
都必须扫描列表,以找到与刚才找到的值完全相同的值。(另外,
如果剩余的
中的c也在扫描列表,这意味着您可能想要其他东西,可能是一个集合。)
end = remaining.index(c)
for i in range(end):
    if i >= end: break
    t = remaining[i]
    # possibly subtract from end within the loop
    # so we don't have to recalculate remaining.index(c)