【问题标题】:How to properly check a List for a match when no match is expected?当预期没有匹配时,如何正确检查匹配列表?
【发布时间】:2011-06-05 15:55:11
【问题描述】:

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

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

当没有匹配的键时,这会引发错误。我可以捕捉到异常,但我怀疑我没有正确理解如何检查列表中的匹配项。

【问题讨论】:

  • 如果要存储密钥,则应使用 db.ListProperty(db.Key),而不是 StringListProperty。 'in' 也适用于那些。

标签: python google-app-engine list exception exception-handling


【解决方案1】:

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

其次,你对 try/catch 的看法是对的,如果你预计大部分时间匹配,你应该使用它。

第三,我认为你正在寻找,

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

编辑:这里有两个链接可以阐明运行时保证。编写代码时需要立即了解的非常好的知识,以自动降低运行时间
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

【讨论】:

  • 这是在 List 中的原因是因为 Google 建议使用 ListProperties 而不是 ReferenceProperties 来存储多对多关系中的键。处理 ReferenceProperty 需要更多处理。我认为他们的回答解释了 Python 方面的问题。 ??
  • 集合不是我可以从他们的文档中看到的参考属性。我认为他们只是说 ListProperties 将作为列表返回给您(从他们的内部数据存储中)。它并不排除您使用集合。考虑运行时间差。如果您只使用列表并进行k 查找,那么最坏的情况是您正在查看k*n 查找。通过使用字典,您的初始成本将为n,但之后的查找仅为1,因此您正在查看k+n。进行了一些编辑以向您展示如何使用 dict。
【解决方案2】:
>>> strings = ['abc', 'def', 'ghi']
>>> 'def' in strings
True
>>> 'foo' in strings
False

【讨论】:

  • 我喜欢它如此直观的方式。 Python
【解决方案3】:

这行得通吗?

if user_key in entity.string_list:
    # ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-02
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 2018-12-30
    • 1970-01-01
    相关资源
    最近更新 更多