2016-05-04 12 views
4

Noch lernen und haben dies bereits mit verschachtelten Loops gemacht, aber ich frage mich, ob es eine schöne und kondensierte Möglichkeit, eine Liste von Strings aus einer anderen Liste herauszufiltern Saiten. Ich habe im Grunde eine 300 Spalte Pandas Datenrahmen und möchte einige Spalten aus dem Datenrahmen loswerden, wenn sie einige Schlüsselwörter haben. Dann ist geplant, die Spaltentitel anzugeben, um einen neuen Datenrahmen zu erstellen.Pythonic Weg eine Liste von Strings aus einer anderen Liste von Strings zu filtern

Hier sind meine Versuche Liste Verständnis:

filter_array = ['hi', 'friend'] 
col_names = ['nice', 'to', 'meet', 'you' + 'friend'] 
p = [i for i in col_names if i not in filter_array] 
print(p) 
p = [i for i in col_names if e for e in filter_array e not in i] 
print(p) 
p = [i for i in col_names if e not in i for e in filter_array] 
print(p) 

Die ersten Arbeiten Versuch aber ‚Sie + Freund‘ nicht entfernt, wo das Filterwort vorhanden ist, aber genau gleich der Spalte Name so gehalten wird. Mein letzter Versuch gibt 'e ist vor der Zuweisung referenziert'

Auch warum gibt es kein Tag für Pythonic! :)

Danke Jungs und Mädels

+1

Vielen Dank für Ihre Versuche! –

Antwort

5

Ich denke, das wird Sie das Ergebnis Sie suchen:

>>> filter_array = ['hi', 'friend'] 
>>> col_names = ['nice', 'to', 'meet', 'you' + 'friend'] 
>>> 
>>> [c for c in col_names if all([f not in c for f in filter_array])] 
['nice', 'to', 'meet'] 

Es ist erwähnenswert, (aus den Kommentaren), dass Sie die innere [] fallen kann in der Aufruf an all, dieses innere Listenverständnis in einen Generatorausdruck zu ändern. Das Listenverständnis wird mehr Speicher verbrauchen, aber einen Generatorausdruck übertreffen, wenn alle Schritte des Generators verbraucht werden müssen (wenn all nicht kurzschließen kann). Sie können die Logik auch mit any anstelle von all umkehren. Ex:

>>> [c for c in col_names if all(f not in c for f in filter_array)] 
['nice', 'to', 'meet'] 
>>> [c for c in col_names if not any(f in c for f in filter_array)] 
['nice', 'to', 'meet'] 
+2

Sie könnten auch 'not any (f nicht in c für f in filter_array)' verwenden, anstatt das 'not' in das Verständnis zu stellen. Ich denke auch, dass es sinnvoll ist, einen Generatorausdruck anstelle eines Listenverständnisses zu verwenden, da 'all' oder' any' kurzgeschlossen werden. – Blckknght

+0

Sie haben Recht - ich habe beide Vorschläge in der Antwort mit Beispielen notiert. –

0

Potenziell ein effizienter Weg, dies zu tun, ist die Liste der Tags in einer Dann set()

zu drehen, können Sie so etwas wie filteredSet = setA - setB tun, die in einer Kopie von setA mit dem Ergebnis wird Elemente in SetB wurden daraus entfernt.

+1

Wenn Sie nur zu Sets wechseln, wird nichts mit dem Teilstring zu tun haben, zu dem er Hilfe anfordert. –

Verwandte Themen