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'])
>>>
最初の答えのw / r / tの提案は、セットと辞書が一意の結果をすばやく取得するのに優れていることです。リストのメンバーシップは他のタイプのO(n)対O(1)です。追加のデータを保存するか、前述の unique_results
リストを作成するなどの操作を行う場合は、次のような操作を行うことをお勧めします。
unique_results = {}
>>> for item in a:
unique_results[item] = ''
>>> unique_results
{'livejournal.com': '', 'google.com': '', 'stackoverflow.com': ''}
他のヒント
1つのオプションは、結果をセットオブジェクトに入れることです。
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()
より良い解決策があれば、共有してください。
所属していません StackOverflow