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']

Antworten:


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

Diese werden als Listenverständnisse bezeichnet .


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]

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']

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.


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']
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.