2011-01-08 14 views
0

Pythonの慣用句と構文には新しいものがあります。私はユーザーキーを保持するDatastore StringListPropertyを持っています。ほとんどのエンティティでは、このプロパティは0〜10個のキーを持ちます。私はキーのプロパティをチェックする必要があります、最も頻繁に一致することはありません。マッチが予想されないときにリストを正しくチェックしてマッチする方法は?

if entity.string_list.index(user_key) is not None: 
    # .... 

これは、一致するキーがない場合にエラーをスローします。私は例外をキャッチすることができますが、リスト内の一致をチェックする方法を正しく理解していないと思われます。

+0

キーを格納する場合は、StringListPropertyではなくdb.ListProperty(db.Key)を使用する必要があります。 'in'も同様に機能します。 –

答えて

2
>>> strings = ['abc', 'def', 'ghi'] 
>>> 'def' in strings 
True 
>>> 'foo' in strings 
False 
+0

私はそれがどのように直感的であるのが大好きです。 Python <3 – Blender

0

これは機能しますか?

if user_key in entity.string_list: 
    # ... 
5

まず第一に、あなたは秩序を維持する必要がない限り、あなたの代わりに、リストのセットや辞書を使用する必要があります検索の多くをやろうとしている場合。リストのルックアップはO(n)であり、タプル/辞書がはるかに優れていることがわかります。私は一定の時間のルックアップを信じています。

第2に、あなたはtry/catchについて正しいです。あなたがその時間のほとんどを期待している場合は、と一致する必要があります。

第三に、私はEDIT

if user_key in entity.string_list: 
    idx = entity.string_list.index(user_key) 

、あなたが探していると思う:ここでは、実行時の保証にいくつかの光を当てる2つのリンクがあります。辞書を使用して追加する方法:自動的
http://wiki.python.org/moin/TimeComplexity
http://bayes.colorado.edu/PythonIdioms.html

EDIT2をあなたのランタイムを抑えるためにコーディングするときぶっきらぼう知ることは非常に良いもの。

## pre-initialize a dictionary 
lookupdict = dict((val, i) for i, val in enumerate(entity.string_list)) 

# loop over user_key 
    idx = lookupdict.get(user_key, None) 
    if idx is None: 
     continue 

    ## do something with idx 
+0

これはList内にある理由は、GoogleがReferencePropertiesの代わりにListPropertiesを使用して、多対多の関係にキーを格納するよう勧めているからです。 ReferencePropertyを処理する処理が増えています。彼らの答えは、Python側のものを考慮していると思います。 ?? –

+0

セットは、そのドキュメントから参照できる参照プロパティではありません。私は彼らがListPropertiesであるものが(内部データストアから)リストとして返されると言っているだけだと思います。あなたがセットを使用することからあなたを排除するわけではありません。実行時間の差を考慮してください。リストだけを使用して 'k'検索を行うと、最悪の場合は' k * n'検索が行われます。辞書を使うと初期費用は 'n'ですが、その後の検索は' 1'なので 'k + n'を見ています。 dictを使う方法を示すためにいくつかの編集を行いました。 – milkypostman

関連する問題