Temukan dan ganti nilai string dalam daftar

153

Saya mendapat daftar ini:

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

Yang saya inginkan adalah mengganti [br]dengan beberapa nilai fantastis yang serupa dengan <br />dan dengan demikian mendapatkan daftar baru:

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

Jawaban:

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

Ini disebut Daftar Pemahaman .

sberry
sumber
5
Melakukan perbandingan antara metode pemahaman daftar ini dan metode peta (diposting oleh @Anthony Kong), metode daftar ini kira-kira 2x lebih cepat. Juga diizinkan untuk memasukkan beberapa penggantian ke dalam panggilan yang sama, misalnyaresname = [name.replace('DA', 'ADE').replace('DC', 'CYT').replace('DG', 'GUA').replace('DT', 'THY') for name in ncp.resname()]
Steven C. Howell
1
@sberry Saya memiliki daftar ['word STRING', 'word_count BIGINT', 'corpus STRING', 'corpus_date BIGINT']tempat saya mencoba mengganti 'dengan yang kosong tetapi ini tidak berfungsi. bagaimana kita bisa mengganti ini menggunakan ini?
Sandeep Singh
Bagaimana jika salah satu itemnya adalah float / integer?
Patriots299
32

Anda dapat menggunakan, misalnya:

words = [word.replace('[br]','<br />') for word in words]
houbysoft
sumber
2
@macetw Sebenarnya jawaban pertama.
CodeIt
melihat stempel waktu tampaknya mereka berdua menjawab pada saat yang sama, mungkin yang ini terlambat beberapa detik ...
maksbd19
31

Selain pemahaman daftar, Anda dapat mencoba peta

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

Jika Anda bertanya-tanya tentang kinerja berbagai pendekatan, berikut adalah beberapa timing:

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

seperti yang Anda lihat untuk pola-pola sederhana seperti itu pemahaman daftar yang diterima adalah yang tercepat, tetapi perhatikan yang berikut:

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

Ini menunjukkan bahwa untuk substitusi yang lebih rumit, reg-exp yang sudah dikompilasi sebelumnya (seperti pada 9-10) dapat (jauh) lebih cepat. Itu benar-benar tergantung pada masalah Anda dan bagian terpendek dari reg-exp.

Jörn Hees
sumber
3

Contoh dengan for loop (Saya lebih suka Pemahaman Daftar).

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
sumber