Найти и заменить строковые значения в списке


153

Я получил этот список:

words = ['how', 'much', 'is[br]', 'the', 'fish[br]', 'no', 'really']

Я хотел бы заменить [br]на какое-то фантастическое значение, похожее на <br />и получить новый список:

words = ['how', 'much', 'is<br />', 'the', 'fish<br />', 'no', 'really']

Ответы:


274
words = [w.replace('[br]', '<br />') for w in words]

Они называются списками .


5
При выполнении сравнения между этим методом понимания списка и методом карты (опубликованным @Anthony Kong) этот метод списка был примерно в 2 раза быстрее. Также допускается вставка нескольких замен в один и тот же вызов, напримерresname = [name.replace('DA', 'ADE').replace('DC', 'CYT').replace('DG', 'GUA').replace('DT', 'THY') for name in ncp.resname()]
Стивен Хоуэлл,

1
@sberry У меня есть список, ['word STRING', 'word_count BIGINT', 'corpus STRING', 'corpus_date BIGINT']где я пытаюсь заменить 'на пустой, но это не работает. как мы можем заменить это, используя это?
Сандип Сингх

Что делать, если один из элементов является float / integer?
Patriots299

32

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

words = [word.replace('[br]','<br />') for word in words]

2
@macetw На самом деле первый ответ.
CodeIt

Глядя на временную метку, кажется, что они оба ответили одновременно, может быть, эта опоздала на несколько секунд ...
maksbd19

31

Помимо понимания списка, вы можете попробовать карту

>>> map(lambda x: str.replace(x, "[br]", "<br/>"), words)
['how', 'much', 'is<br/>', 'the', 'fish<br/>', 'no', 'really']

15

Если вам интересно узнать о производительности различных подходов, вот несколько моментов:

In [1]: words = [str(i) for i in range(10000)]

In [2]: %timeit replaced = [w.replace('1', '<1>') for w in words]
100 loops, best of 3: 2.98 ms per loop

In [3]: %timeit replaced = map(lambda x: str.replace(x, '1', '<1>'), words)
100 loops, best of 3: 5.09 ms per loop

In [4]: %timeit replaced = map(lambda x: x.replace('1', '<1>'), words)
100 loops, best of 3: 4.39 ms per loop

In [5]: import re

In [6]: r = re.compile('1')

In [7]: %timeit replaced = [r.sub('<1>', w) for w in words]
100 loops, best of 3: 6.15 ms per loop

как вы можете видеть для таких простых шаблонов, приемлемо понимание списка, но посмотрите на следующее:

In [8]: %timeit replaced = [w.replace('1', '<1>').replace('324', '<324>').replace('567', '<567>') for w in words]
100 loops, best of 3: 8.25 ms per loop

In [9]: r = re.compile('(1|324|567)')

In [10]: %timeit replaced = [r.sub('<\1>', w) for w in words]
100 loops, best of 3: 7.87 ms per loop

Это показывает, что для более сложных замен предварительно скомпилированный reg-exp (как в 9-10) может быть (намного) быстрее. Это действительно зависит от вашей проблемы и самой короткой части рег-опыта.


3

Пример с циклом for (я предпочитаю списки).

a, b = '[br]', '<br />'
for i, v in enumerate(words):
    if a in v:
        words[i] = v.replace(a, b)
print(words)
# ['how', 'much', 'is<br/>', 'the', 'fish<br/>', 'no', 'really']
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.