Python: DISTINCT auf GQuery Ergebnismenge (GQL, GAE)
-
04-07-2019 - |
Frage
Stellen Sie sich ein Unternehmen in dem Google App Engine-Datenspeicher bekamen, Links für anonyme Benutzer zu speichern. Sie möchten die folgende SQL-Abfrage ausführen, die nicht unterstützt wird:
SELECT DISTINCT user_hash FROM links
Stattdessen könnten Sie:
user = db.GqlQuery("SELECT user_hash FROM links")
Wie verwenden Python am effizientesten , um das Ergebnis zu filtern, so dass es eine deutliche Ergebnismenge zurückgibt? Wie Sie das DISTINCT Ergebnismenge zählen?
Lösung
Eine Menge ist guter Weg, damit umzugehen:
>>> a = ['google.com', 'livejournal.com', 'livejournal.com', 'google.com', 'stackoverflow.com']
>>> b = set(a)
>>> b
set(['livejournal.com', 'google.com', 'stackoverflow.com'])
>>>
Ein Vorschlag w / r / t die erste Antwort ist, dass Sets und dicts besser sind einzigartige Ergebnisse schnell abrufen, die Mitgliedschaft in Listen ist O (n) im Vergleich zu O (1) für die anderen Typen, also, wenn Sie wollen Speicher zusätzliche Daten oder etwas tun, wie die unique_results
Liste erwähnt zu erstellen, kann es besser sein, etwas zu tun:
unique_results = {}
>>> for item in a:
unique_results[item] = ''
>>> unique_results
{'livejournal.com': '', 'google.com': '', 'stackoverflow.com': ''}
Andere Tipps
Neubelebung diese Frage für die Fertigstellung:
Das Schlüsselwort DISTINCT wurde in Release 1.7.4 .
Sie können die aktualisierte GQL Referenz finden (zum Beispiel für Python) hier .
Eine Möglichkeit wäre, die Ergebnisse in eine gestellte Aufgabe zu setzen:
http://www.python.org/doc /2.6/library/sets.html#sets.Set
Der resultierende Satz wird nur die unterschiedlichen Werte bestanden darin bestehen.
Gelingt das nicht, eine neue Liste nur die einzigartigen Objekte enthält den Aufbau funktionieren würde. So etwas wie:
unique_results = []
for obj in user:
if obj not in unique_results:
unique_results.append(obj)
kann man erkennen, for
Schleife als auch in eine Liste Verständnis kondensiert werden.
Es tut uns Leid, diese Frage bis zu graben, aber in GAE kann ich nicht Objekte wie das vergleichen, muss ich .key verwenden () zum Vergleich wie folgt aus:
Vorsicht, das ist sehr ineffizient:
def unique_result(array):
urk={} #unique results with key
for c in array:
if c.key() not in urwk:
urk[str(c.key())]=c
return urk.values()
Wenn jemand eine bessere Lösung hat, bitte teilen.