Самый быстрый способ проверить, существует ли значение в списке - PullRequest
675 голосов
/ 27 сентября 2011

Какой самый быстрый способ узнать, существует ли значение в списке (список с миллионами значений в нем) и каков его индекс?

Я знаю, что все значения в списке уникальны, как в этом примере.

Первый метод, который я пробую, - это (3,8 с в моем реальном коде):

a = [4,2,3,1,5,6]

if a.count(7) == 1:
    b=a.index(7)
    "Do something with variable b"

Второй метод, который я пробую: (в два раза быстрее: для моего реального кода 1,9 с):

a = [4,2,3,1,5,6]

try:
    b=a.index(7)
except ValueError:
    "Do nothing"
else:
    "Do something with variable b"

Предлагаемые методы от переполнения стека (2,74 с для моего реального кода):

a = [4,2,3,1,5,6]
if 7 in a:
    a.index(7)

В моем реальном коде первый метод занимает 3,81 секунды, а второй - 1,88 секунды. Это хорошее улучшение, но:

Я новичок в Python / scripting, и есть ли более быстрый способ сделать то же самое и сэкономить больше времени на обработку?

Более конкретное объяснение для моего приложения:

В Blender API я могу получить доступ к списку частиц:

particles = [1, 2, 3, 4, etc.]

Оттуда я могу получить доступ к местоположению частицы:

particles[x].location = [x,y,z]

И для каждой частицы я проверяю, существует ли сосед, путем поиска местоположения каждой частицы следующим образом:

if [x+1,y,z] in particles.location
    "Find the identity of this neighbour particle in x:the particle's index
    in the array"
    particles.index([x+1,y,z])

Ответы [ 13 ]

1 голос
/ 29 декабря 2017

Для меня это было 0,030 с (реальное), 0,026 с (пользователь) и 0,004 с (sys).

try:
print("Started")
x = ["a", "b", "c", "d", "e", "f"]

i = 0

while i < len(x):
    i += 1
    if x[i] == "e":
        print("Found")
except IndexError:
    pass
0 голосов
/ 10 июля 2019

@ Решение Уинстона Эверта дает большое ускорение для очень больших списков, но этот ответ stackoverflow указывает, что конструкция try: / exception: / else: будет замедлена, если ветвь исключений часто достигается. Альтернативой является использование метода .get() для dict:

a = [4,2,3,1,5,6]

index = dict((y, x) for x, y in enumerate(a))

b = index.get(7, None)
if b is not None:
    "Do something with variable b"

Метод .get(key, default) только для случая, когда вы не можете гарантировать, что ключ будет в диктанте. Если ключ присутствует , он возвращает значение (как если бы dict[key]), но когда его нет, .get() возвращает значение по умолчанию (здесь None). В этом случае необходимо убедиться, что выбранное значение по умолчанию не будет в a.

0 голосов
/ 19 июля 2018

Код для проверки наличия двух элементов в массиве, произведение которых равно k:

n = len(arr1)
for i in arr1:
    if k%i==0:
        print(i)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...