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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top