Pregunta

Imagina que tienes una entidad en el almacén de datos de Google App Engine, que almacena enlaces para usuarios anónimos. Le gustaría realizar la siguiente consulta SQL, que no es compatible:

SELECT DISTINCT user_hash FROM links

En su lugar, podrías usar:

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

¿Cómo usar Python de manera más eficiente para filtrar el resultado, de modo que devuelva un conjunto de resultados DISTINTO? ¿Cómo contar el conjunto de resultados DISTINTO?

¿Fue útil?

Solución

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 sugerencia de w / r / t la primera respuesta es que los conjuntos y los dicts 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 almacene datos adicionales, o haga algo como crear la lista de 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': ''}

Otros consejos

Reviviendo esta pregunta para completarla:

La palabra clave DISTINCT se ha introducido en versión 1.7.4 .

Puede encontrar la referencia GQL actualizada (por ejemplo para Python) aquí .

Una opción sería colocar los resultados en un objeto establecido:

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

El conjunto resultante constará solo de los valores distintos que se le pasan.

Si falla eso, la creación de 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 para también puede condensarse en una lista de comprensión.

Lamento desenterrar esta pregunta, pero en GAE no puedo comparar objetos como ese, 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, compártala.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top