Редактирование элементов в списке в Python - PullRequest
14 голосов
/ 22 июня 2010

Как удалить символ из элемента в списке?

Пример:

mylist = ['12:01', '12:02']

Я хочу удалить двоеточие из меток времени в файле, чтобы легче было преобразовать их в 24-часовое время. Прямо сейчас я пытаюсь перебрать элементы в списке и найти элемент, содержащий двоеточие и выполняющий замену.

for num in mylist:
    re.sub(':', '', num)

Но, похоже, это не сработает.

Помощь!

Ответы [ 6 ]

18 голосов
/ 22 июня 2010

Решение для понимания списка - самое питонское, но есть важный поворот:

mylist[:] = [s.replace(':', '') for s in mylist]

Если вы присваиваете mylist пустое имя, как в другом ответе, а не mylist[:], «срез целого списка», как я рекомендую, вы действительно делаете что-то совсем другое, чем «замена» записи в списке": вы создаете новый список и просто привязываете прежнее имя, которое ранее использовали для ссылки на старый список.

Если на этот старый список ссылаются несколько имен (включая записи в контейнерах), эта повторная привязка не влияет ни на одно из них: например, если у вас есть функция, которая принимает mylist в качестве аргумента, пустое имя назначение имеет какой-либо эффект только локально для функции и не изменяет то, что вызывающий видит как содержимое списка.

Присваивая срезу целого списка, mylist[:] = ..., изменяет объект списка , а не перебирает переключение привязок голых имен - теперь этот список действительно изменен и, независимо от того, как на него ссылаются новое значение - это то, что видели. Например, если у вас есть функция, которая принимает mylist в качестве аргумента, присвоение среза всего списка изменяет то, что вызывающий абонент видит как содержимое списка.

Ключевым моментом является точное знание того, какого эффекта вы добиваетесь - чаще всего вы захотите изменить объект списка, поэтому, если нужно угадать, назначение среза целого списка обычно является лучшим предположением; -). С точки зрения производительности, это не имеет никакого значения в любом случае (за исключением того, что назначение без имен, если оно хранит как старые, так и новые объекты списка, будет занимать больше памяти в течение любого промежутка времени, конечно, когда оба объекта все еще существуют).

17 голосов
/ 22 июня 2010

Используйте понимание списка для создания нового списка:

>>> mylist = ['12:01', '12:02']
>>> mylist = [s.replace(':', '') for s in mylist]
>>> print mylist
['1201', '1202']

Причина, по которой ваше решение не работает, заключается в том, что re.sub возвращает новую строку - строки неизменны в Python, поэтому re.sub не может изменить существующие строки.

4 голосов
/ 22 июня 2010
for i, num in enumerate(mylist):
    mylist[i] = num.replace(':','')
0 голосов
/ 02 мая 2018

Вместо понимания списка, вы также можете использовать map вызов:

mylist = ['12:01', '12:02']
map(lambda f: f.replace(':', ''), mylist) 

Возвращает:

['1201', '1202']
0 голосов
/ 22 июня 2010

Строки в python являются неизменяемыми, что означает, что ни одна функция не может изменить содержимое существующей строки, предоставляя только новую строку.Вот почему .

См. здесь для обсуждения типов строк, которые могут быть изменены.Однако на практике лучше приспособиться к неизменности строк.

0 голосов
/ 22 июня 2010

Вы должны вставить возврат re.sub обратно в список.Ниже приведен новый список.Но вы можете сделать это и для mylist.

mylist = ['12:01', '12:02']
tolist = []
for num in mylist:
  a = re.sub(':', '', num)
  tolist.append(a)

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