queries ndb google python sql google-app-engine distinct gql

python - google - ndb gql



Python: DISTINCT en el conjunto de resultados de GQuery(GQL, GAE) (4)

Un conjunto es una buena manera de lidiar con eso:

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

Una primera sugerencia, la primera respuesta es que los conjuntos y los dictados son mejores para recuperar resultados únicos rápidamente, la membresía en las listas es O (n) versus O (1) para los otros tipos, por lo que si desea almacenar datos adicionales o haga algo como crear la lista unique_results mencionada, puede ser mejor hacer algo como:

unique_results = {} >>> for item in a: unique_results[item] = '''' >>> unique_results {''livejournal.com'': '''', ''google.com'': '''', ''stackoverflow.com'': ''''}

Imagine que tiene una entidad en el almacén de datos de Google App Engine, que almacena enlaces para usuarios anónimos. Desea realizar la siguiente consulta SQL, que no es compatible:

SELECT DISTINCT user_hash FROM links

En cambio, podrías usar:

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

¿Cómo usar Python de manera más eficiente para filtrar el resultado, por lo que devuelve un conjunto de resultados DISTINCT? ¿Cómo contar el conjunto de resultados DISTINCT?


Una opción sería poner los resultados en un objeto conjunto:

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

El conjunto resultante consistirá solo de los valores distintos pasados ​​a él.

De lo contrario, crear una nueva lista que contenga solo los objetos únicos funcionaría. Algo como:

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

Ese ciclo for puede condensarse en una lista de comprensión también.


Perdón por excavar esta pregunta, pero en GAE no puedo comparar objetos así, debo usar .key () para hacer una comparación como esa:

Cuidado, esto es muy ineficiente:

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 alguien tiene una mejor solución, por favor comparte.


Reviviendo esta pregunta para completarla:

La palabra clave DISTINCT se introdujo en la versión 1.7.4 .

Aquí puede encontrar la referencia GQL actualizada (por ejemplo, para Python).