Tìm và thay thế các giá trị chuỗi trong danh sách


153

Tôi có danh sách này:

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

Những gì tôi muốn là thay thế [br]bằng một số giá trị tuyệt vời tương tự <br />và do đó có được một danh sách mới:

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

Câu trả lời:


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

Chúng được gọi là Danh sách toàn diện .


5
Thực hiện so sánh giữa phương pháp hiểu danh sách này và phương pháp bản đồ (được đăng bởi @Anthony Kong), phương pháp danh sách này nhanh hơn khoảng 2 lần. Ngoài ra nó cho phép chèn nhiều thay thế vào cuộc gọi tương tự, ví dụ:resname = [name.replace('DA', 'ADE').replace('DC', 'CYT').replace('DG', 'GUA').replace('DT', 'THY') for name in ncp.resname()]
Steven C. Howell

1
@sberry Tôi có một danh sách ['word STRING', 'word_count BIGINT', 'corpus STRING', 'corpus_date BIGINT']mà tôi đang cố gắng thay thế 'bằng sản phẩm nào nhưng nó không hoạt động. Làm thế nào chúng ta có thể thay thế bằng cách sử dụng này?
Sandeep Singh

Nếu một trong các mục là số float / số nguyên thì sao?
Yêu

32

Bạn có thể sử dụng, ví dụ:

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

2
@macetw Trong thực tế câu trả lời đầu tiên.
CodeIt

Nhìn vào dấu thời gian có vẻ như cả hai đều trả lời cùng một lúc, có lẽ điều này bị trễ bởi một vài giây ...
maksbd19

31

Bên cạnh việc hiểu danh sách, bạn có thể thử bản đồ

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

15

Trong trường hợp bạn đang tự hỏi về hiệu suất của các phương pháp khác nhau, đây là một số thời gian:

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

như bạn có thể thấy đối với các mẫu đơn giản như vậy, việc hiểu danh sách được chấp nhận là nhanh nhất, nhưng hãy xem các điều sau:

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

Điều này cho thấy rằng đối với các thay thế phức tạp hơn, reg-exp được biên dịch trước (như trong 9-10) có thể nhanh hơn (nhiều). Nó thực sự phụ thuộc vào vấn đề của bạn và phần ngắn nhất của reg-exp.


3

Một ví dụ với vòng lặp for (tôi thích Danh sách hiểu).

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']
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.