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']

Jawaban:


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

Ini disebut Daftar Pemahaman .


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]

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']

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.


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']
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.