Python: DISTINCT для набора результатов GQuery (GQL, GAE) - PullRequest
7 голосов
/ 27 октября 2008

Представьте, что вы получили объект в хранилище данных Google App Engine, где хранятся ссылки для анонимных пользователей. Вы хотели бы выполнить следующий SQL-запрос, который не поддерживается:

SELECT DISTINCT user_hash FROM links

Вместо этого вы можете использовать:

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

Как наиболее эффективно использовать Python для фильтрации результата, чтобы он возвращал набор результатов DISTINCT? Как посчитать набор результатов DISTINCT?

Ответы [ 4 ]

5 голосов
/ 05 января 2013

Восстановление этого вопроса для завершения:

Ключевое слово DISTINCT было введено в версии 1.7.4 .

Вы можете найти обновленную ссылку на GQL (например, для Python) здесь .

3 голосов
/ 27 октября 2008

Набор - хороший способ справиться с этим:

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

Одно из предложений, что касается первого ответа, состоит в том, что наборы и подсказки лучше для быстрого получения уникальных результатов, членство в списках равно O (n) против O (1) для других типов, поэтому если сохранить дополнительные данные или сделать что-то вроде создания упомянутого списка unique_results, может быть лучше сделать что-то вроде:

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


>>> unique_results
{'livejournal.com': '', 'google.com': '', 'stackoverflow.com': ''}
1 голос
/ 27 октября 2008

Один из вариантов - поместить результаты в заданный объект:

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

Результирующий набор будет состоять только из отдельных значений, переданных в него.

Если это не удастся, будет работать новый список, содержащий только уникальные объекты. Что-то вроде:

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

Этот цикл for также может быть сведен к пониманию списка.

0 голосов
/ 17 марта 2011

Извините, что расспросил этот вопрос, но в GAE я не могу сравнивать подобные объекты, для сравнения я должен использовать .key ():

Осторожно, это очень неэффективно:

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

Если у кого-то есть лучшее решение, поделитесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...