ค้นหาและแทนที่ค่าสตริงในรายการ


153

ฉันได้รับรายการนี้:

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

สิ่งที่ฉันต้องการคือการแทนที่[br]ด้วยค่าที่ยอดเยี่ยมบางอย่างที่คล้ายกับ<br />และได้รับรายการใหม่:

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

คำตอบ:


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

เหล่านี้เรียกว่ารายการ comprehensions


5
ทำการเปรียบเทียบระหว่างรายการความเข้าใจในรายการนี้กับวิธีการแผนที่ (โพสต์โดย @Anthony Kong) วิธีการรายการนี้เร็วกว่าประมาณ 2 เท่า นอกจากนี้ยังอนุญาตให้ใส่หลายรายการลงในการโทรเดียวกันได้เช่นresname = [name.replace('DA', 'ADE').replace('DC', 'CYT').replace('DG', 'GUA').replace('DT', 'THY') for name in ncp.resname()]
Steven C Howell

1
@sberry ฉันมีรายการ['word STRING', 'word_count BIGINT', 'corpus STRING', 'corpus_date BIGINT']ที่ฉันพยายามแทนที่'ด้วยว่าง แต่ไม่ทำงาน เราจะแทนที่สิ่งนี้โดยใช้สิ่งนี้ได้อย่างไร
Sandeep Singh

เกิดอะไรขึ้นถ้ารายการใดรายการหนึ่งเป็นทศนิยม / จำนวนเต็ม?
Patriots299

32

คุณสามารถใช้ตัวอย่างเช่น:

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

2
@macetw ในความเป็นจริงคำตอบแรก
CodeIt

ดูการประทับเวลาดูเหมือนว่าพวกเขาทั้งคู่ตอบในเวลาเดียวกันบางทีอันนี้อาจจะช้าไป
หน่อยใน


15

ในกรณีที่คุณสงสัยเกี่ยวกับประสิทธิภาพของวิธีการต่าง ๆ ต่อไปนี้เป็นเวลา:

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

ดังที่คุณสามารถเห็นรูปแบบง่าย ๆ ความเข้าใจในรายการที่ยอมรับนั้นเร็วที่สุด แต่ดูต่อไปนี้:

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

สิ่งนี้แสดงให้เห็นว่าสำหรับการทดแทนที่ซับซ้อนยิ่งขึ้นการเรียบเรียง reg-exp ล่วงหน้า (เหมือนใน9-10) จะเร็วขึ้น (มาก) มันขึ้นอยู่กับปัญหาของคุณและส่วนที่สั้นที่สุดของ reg-exp


3

ตัวอย่างสำหรับ for loop (ฉันชอบ 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']
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.