7

匿名ユーザーのリンクを格納するエンティティが Google App Engine データストアにあるとします。次の SQL クエリを実行しようとしていますが、これはサポートされていません:

SELECT DISTINCT user_hash FROM links

代わりに、次を使用できます。

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

Python を最も効率的に使用して結果をフィルタリングし、DISTINCT 結果セットを返す方法は? DISTINCT 結果セットをカウントする方法は?

4

4 に答える 4

5

完了するためにこの質問を復活させる:

DISTINCT キーワードは、リリース 1.7.4で導入されました。

更新された GQL リファレンス (Python など)は、こちらで確認できます。

于 2013-01-05T07:38:24.033 に答える
3

セットはそれに対処する良い方法です:

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

最初の答えの1つの提案は、セットとディクテーションは一意の結果をすばやく取得するのに優れているということです。リストのメンバーシップはO(n)対他のタイプのO(1)であるため、追加のデータを保存したい場合、または言及されたunique_resultsリストを作成するようなことをする場合、次のようなことをする方が良いかもしれません:

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


>>> unique_results
{'livejournal.com': '', 'google.com': '', 'stackoverflow.com': ''}
于 2008-10-27T08:25:57.947 に答える
1

1 つのオプションは、結果を set オブジェクトに入れることです。

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ループは、リスト内包表記にも凝縮できます。

于 2008-10-27T08:01:47.747 に答える
0

この質問を掘り下げて申し訳ありませんが、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()

誰かがより良い解決策を持っている場合は、共有してください。

于 2011-03-17T15:04:24.720 に答える