Suchen und Ersetzen von Zeichenfolgenwerten in der Liste

153

Ich habe diese Liste:

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

Was ich möchte, ist, durch [br]einen fantastischen Wert zu ersetzen , der dem ähnlich ist, <br />und somit eine neue Liste zu erhalten:

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

Antworten:

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

Diese werden als Listenverständnisse bezeichnet .

sberry
quelle
5
Bei einem Vergleich zwischen dieser Listenverständnismethode und der Kartenmethode (veröffentlicht von @Anthony Kong) war diese Listenmethode ungefähr zweimal schneller. Es war auch möglich, mehrere Ersetzungen in denselben Anruf einzufügen, z. B.resname = [name.replace('DA', 'ADE').replace('DC', 'CYT').replace('DG', 'GUA').replace('DT', 'THY') for name in ncp.resname()]
Steven C. Howell,
1
@sberry Ich habe eine Liste, ['word STRING', 'word_count BIGINT', 'corpus STRING', 'corpus_date BIGINT']in der ich versuche, durch 'leer zu ersetzen, aber das funktioniert nicht. Wie können wir dies dadurch ersetzen?
Sandeep Singh
Was ist, wenn eines der Elemente ein Float / eine Ganzzahl ist?
Patriots299
32

Sie können zum Beispiel verwenden:

words = [word.replace('[br]','<br />') for word in words]
houbysoft
quelle
2
@macetw In der Tat die erste Antwort.
CodeIt
Ein Blick auf den Zeitstempel scheint, dass beide gleichzeitig geantwortet haben. Vielleicht ist dieser um einen Bruchteil von Sekunden zu spät ...
maksbd19
31

Neben dem Listenverständnis können Sie auch die Karte ausprobieren

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

Falls Sie sich über die Leistung der verschiedenen Ansätze wundern, finden Sie hier einige Zeitpunkte:

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

Wie Sie für solch einfache Muster sehen können, ist das akzeptierte Listenverständnis am schnellsten, aber sehen Sie sich Folgendes an:

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

Dies zeigt, dass für kompliziertere Substitutionen eine vorkompilierte reg-exp (wie in 9-10) (viel) schneller sein kann. Es hängt wirklich von Ihrem Problem und dem kürzesten Teil der Registrierung ab.

Jörn Hees
quelle
3

Ein Beispiel mit for-Schleife (ich bevorzuge Listenverständnisse).

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']
Waket Zheng
quelle