Python: метод добавления / расширения - PullRequest
0 голосов
/ 19 октября 2019

Может кто-нибудь объяснить мне, почему после цикла for список res равен ['m']?

string = 'spam'
for x in string:
    res =[]
    res.extend(x)
print(res)

Я ожидал, что результат будет res = ['s', 'p', 'a', 'm']

Ответы [ 5 ]

2 голосов
/ 19 октября 2019

Вы заменяете объект списка каждый шаг вашего цикла . Оператор res = [] создает новый пустой объект списка, затем добавляет в этот список одну букву.

Без цикла это то, что вы делаете:

>>> x = 's'
>>> res = []
>>> res.extend(x)
>>> res
['s']
>>> x = 'p'
>>> res = []
>>> res.extend(x)
['p']
>>> x = 'a'
>>> res = []
>>> res.extend(x)
>>> res
['a']
>>> res = []
>>> x = 'm'
>>> res.extend(x)
>>> res
['m']

Создайтесписок вне цикла, один раз :

string = 'spam'
res = []
for x in string:
    res.extend(x)
print(res)

Теперь вы не продолжаете заменять объект списка новым на каждую итерацию forloop.

Опять же, удалив цикл и выполнив шаги вручную, теперь мы имеем:

>>> res = []
>>> x = 's'
>>> res.extend(x)
>>> res
['s']
>>> x = 'p'
>>> res.extend(x)
>>> res
['s', 'p']
>>> x = 'a'
>>> res.extend(x)
>>> res
['s', 'p', 'a']
>>> x = 'm'
>>> res.extend(x)
>>> res
['s', 'p', 'a', 'm']

Не то, чтобы вы использовали здесь res.extend();это работает только потому, что отдельные буквы в string, присвоенные x, также являются строками, и даже однобуквенные строки все еще являются последовательностями. То, что вы действительно делаете с res.extend(x), эквивалентно for element in x: res.append(element), но x всегда будет иметь только один элемент.

Так что это тоже будет работать:

string = 'spam'
res = []
for x in string:
    res.append(x)
print(res)

илипросто добавьте res к целому string значению:

string = 'spam'
res = []
res.extend(string)
print(res)

или, если вы просто хотели получить список всех символов строки, просто используйте функцию list():

string = 'spam'
res = list(string)
print(res)

list() делает именно то, что вы хотели сделать с вашим циклом: создать пустой список, перебрать ввод и добавить каждый элемент в новый список, который затем возвращается:

>>> string = 'spam'
>>> list(string)
['s', 'p', 'a', 'm']
0 голосов
/ 19 октября 2019

Я думаю, что это самый простой способ:

string = 'spam'
res = list(string)
0 голосов
/ 19 октября 2019

Вы сбрасываете res каждый раз внутри цикла. Вы должны использовать это-

string = ‘spam’
res =[]
for x in string:   
    res.extend(x)
print(res)
0 голосов
/ 19 октября 2019

Вы всегда повторно инициализируете список res в цикле for, поэтому на последней итерации цикла список инициализируется равным [] пустому списку и к нему добавляется последняя буква.

string = 'spam'
res =[]
for x in string:
    res.extend(x)
print(res)

или для простоты используйте встроенную функцию list, которая принимает повторяемую как строку и преобразует ее в список объект:

>>> list('spam')
['s', 'p', 'a', 'm']
0 голосов
/ 19 октября 2019

Вы никогда не получите этот вывод, потому что для каждой итерации цикла вы устанавливаете res = [], и поэтому будет работать только последняя итерация, расширяя пустой список с помощью 'm'.

Фиксированныйкод выглядит так:

string = 'spam'
res = []
for x in string:
    res.extend(x)
print(res)

Еще одно замечание: в этом случае вам, вероятно, следует использовать .append. .extend - для добавления всей итерации, но поскольку вы добавляете только один элемент за раз, в этом нет необходимости. Проверьте здесь для хорошего объяснения.

Также последнее замечание: вы должны быть осторожны с редактированием кода Python вне обычного текста или редакторов кода. Вы используете несколько ведущих и конечных апострофов ‘’ вместо обычных '', которые в какой-то момент вызовут у вас проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...