Listedeki dize değerlerini bulma ve değiştirme


153

Bu listeyi aldım:

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

Ne istiyorum [br]benzer bazı fantastik değeri ile değiştirmek <br />ve böylece yeni bir liste elde etmektir :

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

Yanıtlar:


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

Bunlara Liste Anlamaları denir .


5
Bu liste anlama yöntemi ile harita yöntemi (@Anthony Kong tarafından yayınlanan) arasında bir karşılaştırma gerçekleştirildiğinde, bu liste yöntemi yaklaşık 2 kat daha hızlıydı. Ayrıca aynı çağrıya birden fazla değişiklik eklemeye izin verdi, örneğinresname = [name.replace('DA', 'ADE').replace('DC', 'CYT').replace('DG', 'GUA').replace('DT', 'THY') for name in ncp.resname()]
Steven C. Howell

1
@sberry Boş ile ['word STRING', 'word_count BIGINT', 'corpus STRING', 'corpus_date BIGINT']değiştirmeye çalıştığım bir listem var 'ama bu çalışmıyor. bunu kullanarak bunu nasıl değiştirebiliriz?
Sandeep Singh

Öğelerden biri bir kayan nokta / tam sayı ise ne olur?
Patriots299

32

Örneğin şunları kullanabilirsiniz:

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

2
@macetw Aslında ilk cevap.
CodeIt

zaman damgasına bakarak her ikisi de aynı anda cevap veriyor gibi görünüyor, belki bu bir saniye bir kısmını geç ...
maksbd19

31

Liste kavramanın yanı sıra haritayı deneyebilirsiniz

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

15

Farklı yaklaşımların performansını merak ediyorsanız, işte bazı zamanlamalar:

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

Bu tür basit kalıplar için gördüğünüz gibi, kabul edilen liste kavraması en hızlısıdır, ancak aşağıdakilere bakın:

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

Bu, daha karmaşık ikameler için, önceden derlenmiş bir reg-exp'in (olduğu gibi 9-10) (çok) daha hızlı olabileceğini gösterir. Bu gerçekten probleminize ve reg-exp'in en kısa kısmına bağlıdır.


3

For döngüsü ile bir örnek (Liste Anlamalarını tercih ederim).

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']
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.