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

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]

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

sberry
источник
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]
houbysoft
источник
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']
Вакет Чжэн
источник