如何在 python 的列表理解中使用赋值操作并将以下迭代代码转换为它?

How can I use assignment operation in list comprehension in python and convert following iterative code into it?

我写了复杂度为 O(n/2) 的反向列表代码,但我想知道如何将这段代码实现到列表理解中,以了解列表理解中的赋值操作。

word = list("overflow")
length = len(word)
for i in range(length//2):
  word[i] , word[(length-1)-i] = word[(length-1)-i] , word[i]

print(word)

我做了一些与我的解决方案相关的研究,但我发现 := 这个运算符并尝试但没有用。

word = list("overflow")
length = len(word)
word = [ word[i],word[(length-1)-i] := word[(length-1)-i] ,word[i] for i in range(length//2) ]
print(word)

列表理解用于生成列表,而不是修改现有列表。如果您想修改列表,请使用 for 循环,因为这就是它们的用途。 你可以这样做兄弟

def Reverse(lst):
    return [ele for ele in reversed(lst)]
print(Reverse("overflow")

return

['w', 'o', 'l', 'f', 'r', 'e', 'v', 'o']

我认为这是你需要的

首先,您不应该使用列表推导来处理副作用。列表理解用于表达 功能,mapping/filtering 对任意可迭代对象的操作以创建新列表 .

此外,赋值表达式explicitly aren't allowed用于项目赋值(a[k] = b),仅对名称进行简单赋值(a = b)。所以你可以只使用一个函数来使用赋值语句:

In [1]: def _reverse_helper(word, i):
   ...:     length = len(word)
   ...:     word[i] , word[(length-1)-i] = word[(length-1)-i] , word[i]
   ...:

In [2]: word = list("overflow")
   ...:

现在,再次将列表推导的结果重新分配给 word 没有任何意义,因为 您正在使用列表推导来解决副作用。所以,做这样的事情最接近你原来的实现:

In [3]: [_reverse_helper(word, i) for i in range(len(word)//2)]
Out[3]: [None, None, None, None]

In [4]: word
Out[4]: ['w', 'o', 'l', 'f', 'r', 'e', 'v', 'o']

这个实际上非常接近 (Try it online!):

[0 for i in range(length//2) for word[i], word[~i] in [(word[~i], word[i])]]

但是正如大家已经说过的那样,不要使用列表组合来解决它的副作用。