Ich denke, die Liste Comprehensions kann mir dies geben, aber ich bin mir nicht sicher: irgendwelche eleganten Lösungen in Python (2.6) im Allgemeinen für die Auswahl von einzigartigen Objekten in einer Liste und bietet eine Anzahl?Können Pythons Listenkomprehensionen (im Idealfall) das Äquivalent von 'count (*) ... group by ...' in SQL ausführen?
(Ich habe eine __eq__
definiert, um Eindeutigkeit für meine Objektdefinition zu definieren).
So in RDBMS-Land, etwa so:
CREATE TABLE x(n NUMBER(1));
INSERT INTO x VALUES(1);
INSERT INTO x VALUES(1);
INSERT INTO x VALUES(1);
INSERT INTO x VALUES(2);
SELECT COUNT(*), n FROM x
GROUP BY n;
Welche gibt:
COUNT(*) n
==========
3 1
1 2
, hier also meine gleichwertige Liste in Python:
[1,1,1,2]
Und ich will die gleiche Ausgabe wie die SQL-SELECT gibt oben.
EDIT: Das Beispiel, das ich hier gab wurde vereinfacht, ich bin der Verarbeitung tatsächlich Listen von benutzerdefinierten Objekt-Instanzen: nur der Vollständigkeit halber füge ich den zusätzlichen Code, den ich brauchte die ganze Sache an die Arbeit:
import hashlib
def __hash__(self):
md5=hashlib.md5()
[md5.update(i) for i in self.my_list_of_stuff]
return int(md5.hexdigest(),16)
Die __hash__
Methode wurde benötigt, um die set
Konvertierung zu funktionieren (Ich entschied mich für die Liste Verständnis Idee, die in 2.6 arbeitet [trotz der Tatsache, dass ich gelernt, dass eine Ineffizienz beinhaltet (siehe Kommentare) - mein Datensatz ist klein genug dafür ist kein Problem]). my_list_of_stuff
oben ist eine Liste von (Strings) auf meiner Objektdefinition.
nett ... Prost - funktioniert gut auf meiner 2.6 Installation. – monojohnny
Die defaultdict-Lösung wird bei größeren Wertelisten viel besser funktionieren, da sie die Werte nur einmal wiederholt, anstatt einmal plus einmal für jeden eindeutigen Wert. –
@Thomas: danke für das hinzufügen. – bernie