2015-12-01 3 views
0

Это мой код Python (я использую Python 2.7.6):Удаления запятой идет после слова элемента списка

cn = ['here,', 'there'] 
>>> for c in cn: 
    if c.endswith(','): 
     c = c[:-1] 

>>> print(cn) 
['here,', 'there'] 

Как вы можете видеть, cn[0] все еще имеют Запятую, даже если я сделал c = c[:-1] , Как мне изменить cn[0] так, чтобы он оставался 'here' без запятой?

+1

@juanchopanza Не может согласиться с вами на этом; проблема здесь заключается не в том, как разбить запятую, а на то, как изменить элемент списка. –

+0

@LevLevitsky Да, я склонен согласиться. – juanchopanza

ответ

5

Проблема заключается в том, что вы присвоить новое значение c но не обновлять список. Для того, чтобы манипулировать список на месте вам нужно будет сделать что-то вроде этого:

cn = ['here,', 'there'] 
for index, c in enumerate(cn): 
    if c.endswith(','): 
     cn[index] = c[:-1] 

print(cn) 
['here', 'there'] 

Перечислите дает вам все элементы в списке, наряду с их индексом, а затем, если строка имеет Запятая вам просто обновите элемент списка и правый индекс.

Проблема с вашим кодом заключалась в том, что c просто держал строку 'here,'. Затем вы создали новую строку с запятой и назначили ее c, это не повлияло на список cn. Чтобы иметь какое-либо влияние на список, вам нужно установить новое значение в нужном месте.

Вы также можете использовать список понимание для того чтобы достигнуть того же результата, который мог бы быть более вещий для такой маленькой задачи: (как уже упоминалось @AdamSmith)

cn = [c[:-1] if c.endswith(',') else c for c in cn] 

Это создает новый список из cn, где каждый элемент возвращается без изменений, если он не заканчивается ,, и в противном случае запятая обрезается перед возвратом строки.

Другая вещь, которую вы могли бы использовать встроенные функции rstrip, но было бы удалить все запятые, испытания той не только один. Это будет выглядеть примерно так (опять @AdamSmith указал на это):

cn = map(lambda x: x.rstrip(','), cn) 
+0

, может быть, было бы полезно рассказать ** почему **? описать здесь разницу между изменяемым объектом (списком) и неизменяемым (строка)? – lejlot

+0

@TessellatingHeckler Это не применимо здесь. Проблема в том, что вы мутируете ** список **, когда вы выполняете итерацию по нему, потому что он изменяет длину и, следовательно, результаты итерации. Нет никакой проблемы с изменением значений, которые вы повторяете. Это то, что вы делаете в 95% случаев, когда вы повторяете. Некоторые ответы на эти связанные вопросы делают именно то, что он делает. –

+0

Это, конечно, LESS pythonic, чтобы использовать 'list (map (...))', но я бы лучше посмотрел 'cn = [c [: - 1], если c.endswith (',') else c для c в cn] 'list comp, чем цикл for, который у вас выше. –

1

Что вы сделали скопировать строку с редактирования, и хранить его в новую переменную с именем c, с именем, конфликтовал с оригинал c и overrode.

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

Вы могли бы сделать что-то вроде этого, чтобы сделать новый список, содержащий измененные строки:

newlist = [c.strip(',') for c in cn] 

Или, что более близко к вашему примеру, сохраняя этот подход:

cn = [c[:-1] if c.endswith(',') else c for c in cn] 

Альтернативный цикл -with-enumerate подход в другом ответе будет работать, но я избегаю этого, потому что, в общем, смена списков при итерации по ним может привести к ошибкам, если не сделать тщательное, и это заставляет меня думать, что это плохая привычка вступать в случаи, когда есть еще одна достаточно аккуратная pproach.

+1

Список копирования (данные) - это не то же самое, что и мутирующий один элемент. – kwarunek

+2

Это разделит * все * запятые. OP только полосы 1. –

+0

@ZachGates Также запятые в начале строки. – jpmc26

0

Вы меняете переменную loop c, но вы не меняете списка cn.Чтобы изменить список cn, вместо того, чтобы перебирать его значения , проведите через его индексы. Вот реализация.

for c in range(len(cn)): 
    if cn[c].endswith(','): 
     cn[c] = cn[c][:-1] 
+0

странно видеть этот тип структуры в Python. Вы должны предпочесть 'для idx, значение в enumerate (cn)'. –

+0

@AdamSmith Вау, я так и не думал! Еще одна техника Python для добавления в мой мозг ... –

Смежные вопросы