найти кусок строки в списке и заменить

1

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

Например

listX = ['color green', 'shape circle', 'above t']

Я бы хотел найти все строки, которые начинаются с "выше", я смог выполнить минимальный поиск списка, используя any и оставив следующее пространство 'above ' но я не могу понять, как заменить то, что я находить.

Результат, который я пытаюсь создать, будет:

['color green', 'shape circle', 'above']

Я также хотел бы выяснить, как удалить строку, которая начинается с "выше" из списка.

  • 3
    new_list = [item if not item.startswith('above') else 'above' for item in listX]
Теги:
list

3 ответа

6
Лучший ответ
['above' if x.startswith('above') else x for x in listX]

Если вы хотите удалить все строки, начинающиеся с 'above' вы можете сделать что-то вроде того, что @JonClements упомянуто в комментариях:

[x for x in listX if not x.startswith('above')]

В качестве альтернативы:

from itertools import filterfalse
list(filterfalse(lambda x: x.startswith('above'), listX))
  • 1
    Я предпочитаю свою излишне сложную логику: P
  • 0
    @roganjosh Извините за коллизии: это в основном тот же ответ.
Показать ещё 5 комментариев
3

Я не уверен, что это то, что вы ищете, но это сработало для меня, оно напечатало:

['цвет зеленый', 'круг формы', 'все, что вы хотите']

listX = ['color green', 'shape circle', 'above t']

for i in range(len(listX)):

    splitting = listX[i].split(' ')
    if splitting[0] == 'above':
        listX[i] = 'whatever you want'

print(listX)
  • 0
    .startswith() гораздо более чистый подход IMO, но да, это будет работать
  • 0
    Это может помочь мне понять что-то еще, над чем я работаю. Будет ли splitting[1] возвращать 't', в этом случае?
Показать ещё 1 комментарий
1

Другая альтернатива:

for idx, item in enumerate(listX):
    if item.startswith('above'):
        listX[idx] = 'above'

После этого у нас будет одно или несколько 'above', тогда мы сможем их удалить.

while listX.count('above') > 0:
    listX.remove('above')
  • 1
    Это неплохо для первой части вопроса: изменение списка на месте.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню