Ich habe mehrere Listen mit der gleichen Anzahl von Einträgen (von denen jede eine Objekteigenschaft angibt):
property_a = [545., 656., 5.4, 33.]
property_b = [ 1.2, 1.3, 2.3, 0.3]
...
und Liste mit Flags gleicher Länge
good_objects = [True, False, False, True]
(die leicht durch eine äquivalente Indexliste ersetzt werden könnte:
good_indices = [0, 3]
Was ist der einfachste Weg , um neue Listen zu generieren property_asel
, property_bsel
... , die nur die Werte enthalten , angegeben entweder durch die True
Einträge oder die Indizes?
property_asel = [545., 33.]
property_bsel = [ 1.2, 0.3]
zip
in Python 2 eine neue Liste erstellt wird, in Python 3 jedoch nur ein (fauler) Generator zurückgegeben wird.from itertools import izip
und verwenden, anstattzip
im ersten Beispiel. Das schafft einen Iterator, genau wie Python 3.Ich sehe 2 Optionen.
Verwenden von numpy:
Verwenden Sie ein Listenverständnis und komprimieren Sie es:
quelle
[property_b[i] for i in good_indices]
ist eine gute für die Verwendung ohnenumpy
Verwenden Sie die integrierte Funktion zip
BEARBEITEN
Schauen Sie sich nur die neuen Funktionen von 2.7 an. Es gibt jetzt eine Funktion im itertools-Modul, die dem obigen Code ähnlich ist.
http://docs.python.org/library/itertools.html#itertools.compress
quelle
itertools.compress
hier. Das Listenverständnis ist weitaus besser lesbar, ohne herausfinden zu müssen, was die Heckkompresse tut.Angenommen, Sie haben nur die Liste der Elemente und eine Liste der wahren / erforderlichen Indizes, sollte dies die schnellste sein:
Dies bedeutet, dass die Eigenschaftsauswahl nur so viele Runden ausführt, wie echte / erforderliche Indizes vorhanden sind. Wenn Sie viele Eigenschaftslisten haben, die den Regeln einer einzelnen Tag-Liste (wahr / falsch) folgen, können Sie eine Indexliste mit denselben Grundsätzen für das Listenverständnis erstellen:
Dies durchläuft jedes Element in good_objects (wobei der Index mit enumerate gespeichert wird) und gibt nur die Indizes zurück, bei denen das Element wahr ist.
Für alle, die das Listenverständnis nicht verstehen, gibt es hier eine englische Prosa-Version mit fett hervorgehobenem Code:
Liste den Index für jede Gruppe von Index, Artikel , das existiert in einer Aufzählung von guten Objekten , wenn (wo) das Element True
quelle
Matlab- und Scilab-Sprachen bieten eine einfachere und elegantere Syntax als Python für die von Ihnen gestellte Frage. Ich denke, das Beste, was Sie tun können, ist, Matlab / Scilab mithilfe des Numpy-Pakets in Python nachzuahmen. Auf diese Weise ist die Lösung Ihres Problems sehr präzise und elegant:
Numpy versucht, Matlab / Scilab nachzuahmen, aber es ist mit Kosten verbunden: Sie müssen jede Liste mit dem Schlüsselwort "array" deklarieren, was Ihr Skript überladen wird (dieses Problem besteht bei Matlab / Scilab nicht). Beachten Sie, dass diese Lösung auf Arrays mit Zahlen beschränkt ist, was in Ihrem Beispiel der Fall ist.
quelle
filter
Bibliothek oder die externe Bibliothek erhaltenpandas
. Wenn Sie Sprachen tauschen möchten, können Sie auch R ausprobieren, aber das ist nicht die Frage .