Python: DISTINCT для набора результатов запроса (GQL, GAE)
-
04-07-2019 - |
Вопрос
Представьте, что вы получили объект в хранилище данных 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()
Если у кого-то есть лучшее решение, поделитесь.