Python 当不需要匹配项时,如何正确检查匹配项列表?

Python 当不需要匹配项时,如何正确检查匹配项列表?,python,google-app-engine,list,exception,exception-handling,Python,Google App Engine,List,Exception,Exception Handling,Python习惯用法和语法的新手。我有一个保存用户密钥的数据存储StringListProperty。对于大多数实体,此属性将具有0-10个键,有时甚至更多。我需要检查属性中是否有密钥,通常没有匹配项 if entity.string_list.index(user_key) is not None: # .... 这是在没有匹配的密钥时抛出错误。我可以捕获异常,但我怀疑我没有正确理解如何检查列表中的匹配项。这是否有效 if user_key in entity.string_list:

Python习惯用法和语法的新手。我有一个保存用户密钥的数据存储StringListProperty。对于大多数实体,此属性将具有0-10个键,有时甚至更多。我需要检查属性中是否有密钥,通常没有匹配项

if entity.string_list.index(user_key) is not None:
  # ....
这是在没有匹配的密钥时抛出错误。我可以捕获异常,但我怀疑我没有正确理解如何检查列表中的匹配项。

这是否有效

if user_key in entity.string_list:
    # ...

首先,如果你要做大量的搜索,你应该使用集合或字典而不是列表,除非你需要保持顺序。查找列表是O(n),我知道元组/字典更好。我相信定时查找

第二,关于try/catch,你是对的,如果你认为大多数时候会有一场比赛,你应该使用它

第三,我认为你在寻找

if user_key in entity.string_list:
    idx = entity.string_list.index(user_key)
编辑:这里有两个链接可以帮助您了解运行时保证。编写代码以自动关闭运行时时需要立即了解的非常好的内容

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

我喜欢它如此直观。Python之所以将其列在列表中,是因为Google建议使用ListProperties而不是ReferenceProperty来存储多对多关系中的键。处理ReferenceProperty需要更多的处理。我认为他们的答案解释了事情的Python方面??集合不是我可以从其文档中看到的引用属性。我想他们只是说ListProperties将作为列表返回给您(从其内部数据存储)。它并不排除您使用集合。考虑运行时差。如果您只使用列表并执行
k
查找,那么最坏的情况是您正在查看
k*n
查找。通过使用字典,您的初始成本为
n
,但之后的查找结果仅为
1
,因此您需要查看
k+n
。进行了一些编辑以向您展示如何使用dict。如果您正在存储密钥,则应使用db.ListProperty(db.Key),而不是StringListPropertyin'对那些人也同样有效。
## 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