質問

匿名ユーザーのリンクを保存する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': ''}

他のヒント

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

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

更新されたGQLリファレンス(Pythonなど)を見つけることができますこちら

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

より良い解決策があれば、共有してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top