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.