Редактирование элементов в списке в python
Как удалить символ из элемента в списке?
пример:
mylist = ['12:01', '12:02']
Я хочу удалить двоеточие из меток времени в файле, поэтому я могу более легко преобразовать их в 24hour время. Прямо сейчас я пытаюсь перебрать элементы в списке и найти тот, который содержит двоеточие и делает замену.
for num in mylist:
re.sub(':', '', num)
но это, похоже, не работает.
помогите!
6 ответов
решение постижение список является наиболее подходящие для Python, но, есть очень важный поворот:
mylist[:] = [s.replace(':', '') for s in mylist]
если вы назначить mylist
, barename, как и в другом ответе, а не в mylist[:]
, "срез всего списка", как я рекомендую, вы действительно делаете что-то совсем другое, чем " замена записей в списке": вы создаете новый список и просто восстанавливаете barename, который вы ранее использовали для ссылки на старый список.
если что на старый список ссылаются несколько имен (включая записи в контейнерах), эта привязка не влияет ни на одно из них: например, если у вас есть функция, которая принимает mylist
в качестве аргумента назначение barename имеет какой-либо эффект только локально для функции и не изменяет то, что вызывающий видит как содержимое списка.
присвоение фрагменту всего списка,mylist[:] = ...
, изменяет объект list вместо того, чтобы возиться с переключением Привязок barenames -- теперь этот список действительно изменен, и независимо от того, как он упоминается, новое значение-это то, что видно. Например, если у вас есть функция, которая принимает mylist
в качестве аргумента назначение среза всего списка изменяет то, что вызывающий объект видит как содержимое списка.
главное-точно знать, какой эффект вы хотите - чаще всего вы захотите изменить объект списка, поэтому, если нужно угадать, назначение среза всего списка обычно является лучшим предположением; -). Производительность-мудрый, это в любом случае это не имеет значения (за исключением того, что назначение barename, если оно сохраняет как старые, так и новые объекты списка, займет больше памяти для любого промежутка времени, когда оба объекта все еще вокруг, конечно).
использовать понимание создать новый список:
>>> mylist = ['12:01', '12:02']
>>> mylist = [s.replace(':', '') for s in mylist]
>>> print mylist
['1201', '1202']
причина, по которой ваше решение не работает, заключается в том, что re.sub
возвращает новая string -- strings неизменяемы в Python, поэтому re.sub
невозможно изменить существующие строки.
вы должны вставить возврат re.саб снова в списке. Ниже приведен новый список. Но вы можете сделать это и для mylist.
mylist = ['12:01', '12:02']
tolist = []
for num in mylist:
a = re.sub(':', '', num)
tolist.append(a)
print tolist
строки в python неизменяемы, то есть никакая функция не может изменить содержимое существующей строки, только предоставить новую строку. Вот!--1-->почему.
посмотреть здесь для обсуждения типов строк, которые можно изменить. На практике, однако, лучше приспособиться к неизменности струн.
вместо понимания списка, вы также можете использовать map
звоните:
mylist = ['12:01', '12:02']
map(lambda f: f.replace(':', ''), mylist)
возвращает:
['1201', '1202']