Question

Imaginez que vous disposiez d'une entité dans le magasin de données de Google App Engine, stockant des liens pour les utilisateurs anonymes. Vous souhaitez effectuer la requête SQL suivante, qui n'est pas prise en charge:

SELECT DISTINCT user_hash FROM links

À la place, vous pouvez utiliser:

user = db.GqlQuery("SELECT user_hash FROM links")

Comment utiliser Python de la manière la plus efficace pour filtrer le résultat afin qu'il renvoie un ensemble de résultats DISTINCT? Comment compter le jeu de résultats DISTINCT?

Était-ce utile?

La solution

Un ensemble est un bon moyen de gérer cela:

>>> a = ['google.com', 'livejournal.com', 'livejournal.com', 'google.com', 'stackoverflow.com']
>>> b = set(a)
>>> b
set(['livejournal.com', 'google.com', 'stackoverflow.com'])
>>> 

Une première suggestion, c’est que les ensembles et les dicts sont plus efficaces pour récupérer rapidement des résultats uniques, l’appartenance à une liste est O (n) par rapport à O (1) pour les autres types, alors si vous voulez stocker des données supplémentaires ou créer quelque chose comme créer la liste unique_results mentionnée, il peut être préférable de faire quelque chose comme:

unique_results = {}
>>> for item in a:
    unique_results[item] = ''


>>> unique_results
{'livejournal.com': '', 'google.com': '', 'stackoverflow.com': ''}

Autres conseils

Réactivation de cette question:

Le mot clé DISTINCT a été introduit dans la version 1.7.4 .

Vous pouvez trouver la référence GQL mise à jour (par exemple, pour Python) ici .

Une option serait de placer les résultats dans un objet set:

http://www.python.org/doc /2.6/library/sets.html#sets.Set

L'ensemble résultant ne comportera que les valeurs distinctes qui y sont passées.

À défaut, créer une nouvelle liste contenant uniquement les objets uniques fonctionnerait. Quelque chose comme:

unique_results = []
for obj in user:
    if obj not in unique_results:
        unique_results.append(obj)

Cette boucle pour peut également être condensée dans une liste de compréhension.

Désolé de creuser cette question, mais dans GAE, je ne peux pas comparer des objets comme celui-ci. Je dois utiliser .key () pour une comparaison comme celle-ci:

Attention, cela est très inefficace:

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()

Si quelqu'un a une meilleure solution, partagez-le.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top