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_List Comprehension - Fatal编程技术网

是否有任何方法可以使用python列表理解更新列表的值?

是否有任何方法可以使用python列表理解更新列表的值?,python,python-3.x,list-comprehension,Python,Python 3.x,List Comprehension,例如:primes=[0,0,-1,-1,-1,-1,-1,-1]#这里primes是一个列表 现在我想更新素数的值。下面是正确工作的迭代 for i in range(2, int(n ** 0.5) + 1): for j in range(i,n,i): if(primes[j] == -1): primes[j] = i 这里n=10,i=2。所以基本上迭代从i开始,随着i的增加,迭代到10。 例如,如果我们从j=i=2开始,那么在第一次迭代之后,我们将增加2,并找

例如:
primes=[0,0,-1,-1,-1,-1,-1,-1]#这里primes是一个列表

现在我想更新素数的值。下面是正确工作的迭代

for i in range(2, int(n ** 0.5) + 1):    
 for j in range(i,n,i):
  if(primes[j] == -1):
   primes[j] = i
这里n=10,i=2。所以基本上迭代从i开始,随着i的增加,迭代到10。 例如,如果我们从j=i=2开始,那么在第一次迭代之后,我们将增加2,并找到素数[j]=-1。这将在第一次迭代后产生以下结果

素数[0,0,2,-1,2,-1,2,-1,2,-1,2]

在第二次迭代之后,当我变为3时,如果素数[j]=-1,那么3的倍数将被更新,我们将在第二次迭代之后得到以下结果

素数[0,0,2,3,2,-1,2,-1,2,3,2]

我想知道一个内环的方法,可以写在下面的形式。(下面的表单称为python列表理解。我想使用python列表理解或使用切片方法更新值。)

它给我的错误如下:


ValueError:尝试将大小为2的序列分配给大小为3的扩展切片也不确定为什么要这样做,但这不取决于我:

for i in range(2, int(n ** 0.5) + 1):
    primes[i : n: i] = [i if primes[j]==-1 else primes[j] for j in range(i,n,i) ]

问题是,通过在列表理解中进行筛选,最终要分配的元素少于目标下标的大小。您需要匹配下标中的位置数,即使这意味着重新分配当前值

以下是您如何做到这一点:

primes[i : n: i] = [ [primes[j],i][primes[j]==-1] for j in range(i,n,i) ] 


列表理解用于创建一个新的列表,它总是这样做的。当然,您可以使用slice assignment用另一个列表更新列表,即
somelist[some_slice]=some_list
,但您必须提前知道列表的大小。你为什么不坚持你的代码呢?@juanpa.arrivillaga谢谢你的宝贵评论。我想知道使用列表理解或切片分配进行列表更新,因为在某些情况下,它比使用循环更快(正如我在上面使用两个for循环所做的那样)。因此,为了优化代码并提高效率,我想用切片分配法/列表理解法对其进行更新。理解这一点非常重要,列表理解只比等效的for循环快一点点。列表理解是为了可读性,而不是性能。@juanpa.arrivillaga这种差异对于计算大数据(比如说大约一百万)来说是微不足道的吗?事实上,我正在研究这个问题,所以我不知道这个区别。是的,它总是边缘化的。列表理解使用python for循环。注意,一百万次迭代并不是很大。但是,切片分配要比一次更新一个元素的列表快得多,因此您可能会看到改进。谢谢您的回答@joostblack。我想知道使用列表理解或切片分配进行列表更新,因为在某些情况下,它比使用循环更快(正如我在上面使用两个for循环所做的那样)。因此,为了优化代码并提高效率,我想用切片分配法/列表理解法对其进行更新。
primes[i : n: i] = [ [primes[j],i][primes[j]==-1] for j in range(i,n,i) ] 
primes[i : n: i] = ( i if p<0 else p for p in primes[i:n:i] )
primes = [0,0]+[-1]*(n-1)
for i in range(2, int(n ** 0.5) + 1):
    if primes[i]<0:
       primes[i::i] = (i if p<0 else p for p in primes[i::i])    
primes = list(range(n+1))
for i in range(2, int(n ** 0.5) + 1):
    if primes[i]<i: continue
    primes[i*i::i] = (min(i,p) for p in primes[i*i::i])