Python, узнайте, что в списке нет определенного элемента - PullRequest
8 голосов
/ 15 декабря 2010

Допустим, есть список a, который содержит как цифры, так и буквы. Есть ли быстрый способ узнать, что список не содержит какого-то определенного элемента. Я планирую использовать его в условиях.

Ответы [ 4 ]

19 голосов
/ 15 декабря 2010

Может быть

3 not in [1, 2, "a"]
# True
3 голосов
/ 15 декабря 2010

Примечание: если вы можете поместить элементы в качестве ключей для dict, тогда проверка на членство будет намного быстрее благодаря алгоритму хешированияБудет проблемой только в том случае, если ваш список очень длинный или ваше приложение делает много такого рода вещей.В противном случае, «Х не в Y», как говорит Свен.

2 голосов
/ 15 декабря 2010

Это зависит от того, что вы пытаетесь сделать. Если скорость не имеет значения, используйте значение lst. Если это имеет значение, это будет зависеть от того, сможете ли вы сначала преобразовать свой список в другую структуру данных (т. Е. Будете ли вы часто искать элементы в, скажем, списке), размер и т. Д ...

Чтобы дать идею:

import timeit

a = range(10000)
da = dict(zip(a, [None for i in a]))

def list_first():
    return 0 in a

def dict_first():
    return 0 in da

def list_last():
    return 9999 in a

def dict_last():
    return 9999 in da

if __name__ == "__main__":
    for f in ["list_first", "dict_first", "list_last", "dict_last"]:
        t = timeit.Timer("%s()" % f, setup="from __main__ import %s" % f)
        print min(t.repeat(number=10000))

Это дает мне:

0.00302004814148
0.00318598747253
4.21943712234
0.004145860672

Если вы ищете предмет, который находится в начале списка, использование dict не ускоряет процесс, как ожидалось. Если вы ищете элемент в конце, тогда разница будет очень значительной (на 3 порядка), хотя, как и ожидалось, нужно использовать hashtable, списки должны искать каждый элемент один за другим.

Если элементы сопоставимы, вы также можете значительно ускорить процесс сортировки последовательности и использовать бинарный поиск (log (N) вместо N, log (N) относительно быстро по сравнению с O (1) для N не слишком) большой на практике для Python), или с использованием более сложных структур (бинарное дерево поиска и т. д.). Это может быть довольно сложным - структуры данных для быстрого поиска - одна из наиболее изученных проблем в CS.

0 голосов
/ 15 декабря 2010

ты имеешь в виду

bool([x for x in alist if isinstance(x, int)])

лучшая версия (Свен Марнач):

any(isinstance(x, int) for x in alist)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...