Python: DISTINCT na consulta conjunto de resultados (GQL, GAE)
-
04-07-2019 - |
Pergunta
Imagine que você tem uma entidade no armazenamento de dados do Google App Engine, armazenar ligações para usuários anônimos. Você gostaria de realizar a seguinte consulta SQL, que não é suportado:
SELECT DISTINCT user_hash FROM links
Em vez disso, você poderia usar:
user = db.GqlQuery("SELECT user_hash FROM links")
Como usar Python mais eficiente para filtrar o resultado, então ele retorna um conjunto de resultados distintos? Como contar o conjunto de resultados distintos?
Solução
Um conjunto é boa maneira de lidar com isso:
>>> a = ['google.com', 'livejournal.com', 'livejournal.com', 'google.com', 'stackoverflow.com']
>>> b = set(a)
>>> b
set(['livejournal.com', 'google.com', 'stackoverflow.com'])
>>>
Uma sugestão w / r / t a primeira resposta, é que os conjuntos e dicts são melhores em recuperar resultados únicos rapidamente, participação em listas é O (n) versus O (1) para os outros tipos, por isso, se você quiser armazenar dados adicionais, ou fazer algo como criar a lista unique_results
mencionado, pode ser melhor para fazer algo como:
unique_results = {}
>>> for item in a:
unique_results[item] = ''
>>> unique_results
{'livejournal.com': '', 'google.com': '', 'stackoverflow.com': ''}
Outras dicas
Revivendo esta questão de execução:
A palavra-chave DISTINCT foi introduzido em versão 1.7.4 .
Você pode encontrar a referência GQL atualizado (por exemplo, para Python) aqui .
Uma opção seria colocar os resultados em um objeto set:
http://www.python.org/doc /2.6/library/sets.html#sets.Set
O conjunto resultante vai consistir apenas dos valores distintos passados ??para ele.
Na falta deste, a criação de uma nova lista contendo apenas os objetos únicos iria trabalhar. Algo como:
unique_results = []
for obj in user:
if obj not in unique_results:
unique_results.append(obj)
Esse ciclo for
pode ser condensada em uma compreensão lista também.
Desculpe a cavar esta pergunta-se, mas em GAE Eu não posso comparar objetos como esse, eu deve usar .key () para comparação assim:
Cuidado, isso é muito 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()
Se alguém tiver uma solução melhor, por favor, compartilhe.