Вопрос

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

SELECT DISTINCT user_hash FROM links

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

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

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

Это было полезно?

Решение

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

>>> 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': ''}

Другие советы

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

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

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

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

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 также может быть сведен к списку.

Извините, что расспросил этот вопрос, но в 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()

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top