422 Stimmen

Suchen und Ersetzen von Elementen in einer Liste

Ich muss eine Liste durchsuchen und alle Vorkommen eines Elements durch ein anderes ersetzen. Bisher meine Versuche in Code sind mir nirgends, was ist der beste Weg, dies zu tun?

Nehmen wir zum Beispiel an, meine Liste enthält die folgenden ganzen Zahlen

>>> a = [1,2,3,4,5,1,2,3,4,5,1]

und ich muss alle Vorkommen der Zahl 1 durch den Wert 10 ersetzen, so dass ich die folgende Ausgabe benötige

>>> a = [10, 2, 3, 4, 5, 10, 2, 3, 4, 5, 10]

Mein Ziel ist es also, alle Stellen, an denen die Zahl 1 vorkommt, durch die Zahl 10 zu ersetzen.

707voto

outis Punkte 71613

Versuchen Sie es mit einem Listenverstehen und eine bedingter Ausdruck .

>>> a=[1,2,3,1,3,2,1,1]
>>> [4 if x==1 else x for x in a]
[4, 2, 3, 4, 3, 2, 4, 4]

318voto

ghostdog74 Punkte 305138

Sie können die integrierte enumerate um bei der Iteration der Liste sowohl Index als auch Wert zu erhalten. Verwenden Sie dann den Wert, um auf eine Bedingung zu testen, und den Index, um diesen Wert in der ursprünglichen Liste zu ersetzen:

>>> a = [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1]
>>> for i, n in enumerate(a):
...   if n == 1:
...      a[i] = 10
...
>>> a
[10, 2, 3, 4, 5, 10, 2, 3, 4, 5, 10]

87voto

roipoussiere Punkte 4010

Wenn Sie mehrere Werte zu ersetzen haben, können Sie auch ein Wörterbuch verwenden:

a = [1, 2, 3, 4, 1, 5, 3, 2, 6, 1, 1]
replacements = {1:10, 2:20, 3:'foo'}
replacer = replacements.get  # For faster gets.

print([replacer(n, n) for n in a])

> [10, 20, 'foo', 4, 10, 5, 'foo', 20, 6, 10, 10]

Beachten Sie, dass dieser Ansatz nur funktioniert, wenn die zu ersetzenden Elemente hashfähig sind. Der Grund dafür ist, dass die dict-Schlüssel hashfähig sein müssen.

42voto

damzam Punkte 1875

List comprehension funktioniert gut, und Schleife durch mit enumerate können Sie einige Speicher (b/c die Operation ist im Wesentlichen an Ort und Stelle durchgeführt) zu speichern.

Außerdem gibt es die funktionale Programmierung. Siehe Verwendung von Karte :

>>> a = [1,2,3,2,3,4,3,5,6,6,5,4,5,4,3,4,3,2,1]
>>> map(lambda x: x if x != 4 else 'sss', a)
[1, 2, 3, 2, 3, 'sss', 3, 5, 6, 6, 5, 'sss', 5, 'sss', 3, 'sss', 3, 2, 1]

13voto

kxr Punkte 3782

Bei langen Listen und seltenen Vorkommnissen ist es etwa 3x schneller, wenn man list.index() - im Vergleich zu den in den anderen Antworten vorgestellten einstufigen Iterationsmethoden.

def list_replace(lst, old=1, new=10):
    """replace list elements (inplace)"""
    i = -1
    try:
        while True:
            i = lst.index(old, i + 1)
            lst[i] = new
    except ValueError:
        pass

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X