Finde und ersetze mehrere Werte in Python

8

Ich möchte mehrere Werte in einem 1D-Array / einer Liste mit neuen suchen und ersetzen.

Im Beispiel für eine Liste

%Vor%

Ich möchte

ersetzen %Vor%

mit

%Vor%

Daher ist das neue Array:

%Vor%

Was ist der schnellste Weg, dies zu tun (für sehr große Listen, d. h. mit 50000 Werten zu finden und zu ersetzen)?

Kommentar von dem anwsers

Vielen Dank an alle für eine schnelle Antwort! Ich überprüfte die vorgeschlagenen Lösungen mit folgendem:

%Vor%

Die Ergebnisse:

%Vor%

Der relative Unterschied in der Leistung steigt mit biger N , d. h. wenn N=10**7 , dann nimmt das Ergebnis von Ashwini_Chaudhary 207 ms und das Ergebnis von swenzel 6.89 s .

    
blaz 02.04.2015, 08:04
quelle

9 Antworten

2
%Vor%     
Ashwini Chaudhary 02.04.2015, 08:11
quelle
3

In Vanille Python, ohne die Geschwindigkeit von numpy oder pandas , ist dies eine Möglichkeit:

%Vor%

Die durchschnittliche Zeitkomplexität für diesen Algorithmus ist O(M + N) , wobei M die Länge Ihrer "Übersetzungsliste" und N die Länge der Liste a ist.

    
Shashank 02.04.2015 08:09
quelle
2

Angenommen, Ihr val_old -Array ist sortiert (was hier der Fall ist, aber wenn das später nicht der Fall ist, dann vergessen Sie nicht, val_new mit zu sortieren!), können Sie numpy.searchsorted und dann verwenden Zugriff auf val_new mit den Ergebnissen.
Dies funktioniert nicht, wenn eine Nummer keine Zuordnung hat, müssen Sie in diesem Fall 1to1 Mappings bereitstellen.

%Vor%

50k Zahlen? Kein Problem!

%Vor%

500k? Sie werden den Unterschied nicht bemerken!

%Vor%     
swenzel 02.04.2015 08:59
quelle
1

Das numpy_indexed Paket (Disclaimer: Ich bin der Autor) bietet eine elegante und effiziente vektorisierte Lösung für diese Art von Problem:

%Vor%

Die implementierte Methode basiert auf einer Suche ähnlich der von swenzel und sollte eine ähnlich gute Leistung haben, aber allgemeiner. Zum Beispiel müssen die Elemente des Arrays nicht ints sein, sondern können von jedem Typ sein, sogar nd-Sub-Arrays selbst.

Wenn erwartet wird, dass alle Werte in 'a' in 'val_old' vorhanden sind, können Sie das optionale 'fehlende' kwarg auf 'raise' setzen (Standard ist 'ignore'). Die Leistung wird etwas besser sein, und Sie erhalten einen KeyError, wenn diese Annahme nicht erfüllt ist.

    
Eelco Hoogendoorn 26.07.2016 18:31
quelle
0

Um Werte in einer Liste zu ersetzen, die zwei andere Listen als Schlüssel: Wert-Paare verwenden, gibt es mehrere Ansätze. Alle verwenden "Listenkomprimierung".

Verwenden von list.index ():

%Vor%

Verwenden Sie Ihren speziellen Fall:

%Vor%     
xxyzzy 02.04.2015 08:13
quelle
0

Ich habe es so versucht:

%Vor%     
Hackaholic 02.04.2015 08:22
quelle
0

Versuchen Sie dies für Ihre erwartete Ausgabe, funktioniert auch wenn elements nicht in value_old .

%Vor%     
itzMEonTV 02.04.2015 08:26
quelle
0

In Pandas würde ich ein Diktat aus den 2 Listen erstellen und dann map aufrufen, das eine Suche durchführt und die Werte ersetzt:

%Vor%

Für eine 80000-Element-Serie sind 3,4 ms erforderlich:

%Vor%

Dies ist ein vektorisierter Ansatz und skaliert viel besser als jede iterationsbasierte Methode

    
EdChum 02.04.2015 08:30
quelle
0

Für numpy arrays könnte dies ein Ansatz sein -

%Vor%

Beispiellauf und Timing

Für Eingaben:

%Vor%

Die Laufzeiten in jeder Codezeile waren -

%Vor%     
Divakar 02.04.2015 11:27
quelle

Tags und Links