Как правильно проверить список на совпадение, когда не ожидается совпадение? - PullRequest
0 голосов
/ 08 января 2011

Новое в Python идиомы и синтаксис. У меня есть Datastore StringListProperty, который содержит пользовательские ключи. Для большинства объектов это свойство будет иметь 0-10 ключей, а иногда и много других. Мне нужно проверить свойство на ключ, чаще всего совпадений не будет.

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

Это выдает ошибку, когда нет соответствующего ключа. Я могу поймать исключение, но подозреваю, что неправильно понимаю, как проверять совпадения в Списке.

Ответы [ 3 ]

5 голосов
/ 08 января 2011

Прежде всего, если вы собираетесь много искать, вы должны использовать набор или словарь вместо списка, если вам не нужно поддерживать порядок. Поиск по спискам - O (n), и я знаю, что кортежи / словари намного лучше. Я считаю, постоянный поиск времени.

Во-вторых, вы правы в отношении try / catch, вам следует использовать это, если вы ожидаете, что в большинстве случаев WILL будет совпадением.

В-третьих, я думаю, что вы ищете,

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
2 голосов
/ 08 января 2011
>>> strings = ['abc', 'def', 'ghi']
>>> 'def' in strings
True
>>> 'foo' in strings
False
0 голосов
/ 08 января 2011

Это работает?

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