Encontre e substitua valores de sequência na lista

153

Eu recebi esta lista:

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

O que eu gostaria é substituir [br]por um valor fantástico semelhante <br />e, assim, obter uma nova lista:

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

Respostas:

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

Estes são chamados de compreensões da lista .

sberry
fonte
5
Realizando uma comparação entre esse método de compreensão de lista e o método de mapa (publicado por @Anthony Kong), esse método de lista foi aproximadamente duas vezes mais rápido. Também permitiu inserir várias substituições na mesma chamada, por exemplo,resname = [name.replace('DA', 'ADE').replace('DC', 'CYT').replace('DG', 'GUA').replace('DT', 'THY') for name in ncp.resname()]
Steven C. Howell
1
@berry Eu tenho uma lista ['word STRING', 'word_count BIGINT', 'corpus STRING', 'corpus_date BIGINT']onde estou tentando substituir 'com vazio, mas isso não está funcionando. como podemos substituir isso usando isso?
precisa
E se um dos itens for um número flutuante / inteiro?
Patriots299
32

Você pode usar, por exemplo:

words = [word.replace('[br]','<br />') for word in words]
houbysoft
fonte
2
@ macetw De fato, a primeira resposta.
CodeIt 02/03/19
olhando para o timestamp é parece ambos responderam ao mesmo tempo, talvez este seja tarde por uma fração de segundos ...
maksbd19
31

Além da compreensão da lista, você pode tentar mapear

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

Caso você esteja se perguntando sobre o desempenho das diferentes abordagens, aqui estão alguns horários:

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

como você pode ver para padrões simples, a compreensão da lista aceita é a mais rápida, mas observe o seguinte:

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

Isso mostra que, para substituições mais complicadas, um reg-exp pré-compilado (como em 9-10) pode ser (muito) mais rápido. Realmente depende do seu problema e da parte mais curta do reg-exp.

Jörn Hees
fonte
3

Um exemplo com loop for (eu prefiro List Comprehensions).

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']
Waket Zheng
fonte