Взлом списка и назначение элемента списка за один шаг

Я пытаюсь изменить содержимое списка, созданного с помощью list в строке за один шаг. Например, в приведенном ниже примере я хочу изменить третий элемент (text на teat) сразу после разделения строки за один шаг.

т.е. Предположим, я пытаюсь изменить третий элемент в списке, созданном с помощью list в строке text.

So

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']
  • Есть ли однострочник, который дает мне результат, который я ищу?

  • Почему две попытки, которые я перечислил, не работают? Какой принцип Python я должен прочитать, что удерживает меня от этого?


person patrick    schedule 10.05.2017    source источник


Ответы (3)


Если вам нужен один лайнер, это будет работать:

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

result
Out[583]: 'teat'

Причина, по которой ваш метод не работает, заключается в том, что ничего не возвращается, когда вы присваиваете значение переменной. то есть

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

ничего не возвращает, что вы затем пытаетесь присвоить результату.

person Allen    schedule 10.05.2017
comment
Нет, "a" назначается result - person juanpa.arrivillaga; 10.05.2017
comment
В этом случае результат = список (текст) [2] = a, да, a присваивается результату, потому что это цепное присваивание. Однако в этом случае результат = (список (текст) [2] = a), a не присваивается результату, потому что из-за скобок OP пытается присвоить возвращаемое значение (список (текст) [2] = a) что ни к чему не приведет, что и вызвало ошибку. - person Allen; 10.05.2017
comment
Я пропустил, что вы уронили result = с левой стороны... невнимательно читая - person juanpa.arrivillaga; 10.05.2017

Я бы предложил определить функцию, а затем вызвать ее после этого было бы однострочником (для наиболее чистого кода). подобно,

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

Но если вы ищете строгое однострочное решение, решение Аллена хорошо. Вот еще один, использующий понимание списка.

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
person Rockybilly    schedule 10.05.2017

У вас может быть несколько простых утверждений, разделенных точкой с запятой в одной строке. Итак, вот однострочный:

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

Однако нет необходимости в однострочнике, и несколько операторов в одной строке официально не рекомендуется

Эта конструкция:

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

Не работает, потому что это связанное назначение, поэтому оно присваивает "a" result и list("text")[2]. Но последнее присваивание не имеет значения, потому что список никогда ничему не присваивается и отбрасывается.

По сути, корень вашего непонимания заключается в том, что в Python присваивание не является выражением: оно ничего не оценивает, поэтому оно не создает значение, которому вы можете присвоить. В C, например, присваивание является оператором и вычисляется в левой части присваивания, поэтому:

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

Дает следующий вывод:

10

Но в Python это не выражение, поэтому он выдавал SyntaxError, когда вы заключали его в круглые скобки и пытались присвоить это чему-то другому.

person juanpa.arrivillaga    schedule 10.05.2017