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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top