一步分解列表并分配列表项

Breaking into list and assigning list item in one step

我正在尝试一步更改通过对字符串使用 list 创建的列表的内容。例如,在下面的示例中,我想在一步拆分字符串后立即将第三项(text 更改为 teat) .

即假设我正在尝试更改通过在字符串 text.

上使用 list 创建的列表中的第三项

所以

result= list("text")[2] = "a" 

给我

>>> result
'a'

我认为这可能有效,但它没有:

result= (list("text")[2] = "a")
SyntaxError: invalid syntax

我可以这样达到预期的效果:

result=list("text")
result[2]= "a"

这给了我:

>>> result
['t', 'e', 'a', 't']

如果你需要一个衬垫,这会起作用:

result = "text"[:2]+'a'+"text"[3:]

result
Out[583]: 'teat'

当您为变量赋值时,您的方法不起作用的原因是 returns。即

list("text")[2] = "a" 

returns 什么都没有,然后您尝试将其分配给结果。

我会建议定义一个函数,然后调用它会是一个单行代码(为了最干净的代码)。喜欢,

def replace_character(text, ind, letter):
    text_list = list(text)
    text_list[ind] = letter
    return text_list

但如果您正在寻找严格的单线,Allen 的解决方案是不错的选择。这是另一个使用 列表理解.

result = [letter if ind != 2 else "a" for ind, letter in enumerate(list("text"))]
# This basically does,
# Create a list using the characters of list("text")
# if the index of the character is 2, put "a" instead of character
print result

您可以在同一行上有多个用分号分隔的简单语句。所以这是一个单行:

>>> result = list('text'); result[2] = 'z'
>>> result
['t', 'e', 'z', 't']
>>>

虽然不需要一行,同一行的多个语句是officially discouraged

这个构造:

result= list("text")[2] = "a"

不起作用,因为它是链式赋值,因此它将 "a" 赋值给 resultlist("text")[2]。但后一个分配并不重要,因为列表从未分配给任何东西,并被丢弃。

从根本上说,您误解的根源在于,在 Python 中,赋值 不是 表达式:它不求值任何东西,所以它不产生一个你可以赋值的值。例如,在 C 语言中,赋值 语句并计算赋值的左侧,因此:

#include<stdio.h>
int main(void) {
  int a;
  printf("%d", a = 10);
  return 0;
}

给出以下输出:

10

但在 Python 中,它不是一个表达式,因此当你在它周围加上括号并试图将其分配给其他东西时它会给出 SyntaxError。