Най-бърз начин за проверка дали дадена стойност съществува в списък

Кой е най-бързият начин да разберете дали дадена стойност съществува в списък (списък с милиони стойности) и какъв е нейният индекс?

Знам, че всички стойности в списъка са уникални, както в този пример.

Първият метод, който опитах, е (3,8 сек в реалния ми код):

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

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

Вторият метод, който пробвах, е (2 пъти по-бърз: 1,9 сек. в реалния ми код):

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

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

Предложени методи от потребител на Stack Overflow (2,74 сек. за реалния ми код):

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

В моя реален код първият метод отнема 3,81 сек, а вторият метод - 1,88 сек. Това'е добро подобрение, но:

Има ли по-бърз начин да се направят същите неща и да се спести повече време за обработка?

По-специфично обяснение за моето приложение:

В API на Blender имам достъп до списък с частици:

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])
Решение
7 in a

Най-ясният и бърз начин да го направите.

Можете също така да помислите за използване на set, но конструирането на това множество от вашия списък може да отнеме повече време, отколкото ще спести по-бързото тестване на членството. Единственият начин да сте сигурни е да направите добър сравнителен анализ. (това зависи и от това какви операции ви трябват)

Коментари (7)

Можете да поставите елементите си в set. Търсенето на множества е много ефективно.

Опитайте:

s = set(a)
if 7 in s:
  # do stuff

редактиране В коментар казвате, че бихте искали да получите индекса на елемента. За съжаление множествата нямат понятие за позиция на елемента. Алтернативата е да сортирате списъка си предварително и след това да използвате двоично търсене всеки път, когато трябва да намерите елемент.

Коментари (3)
def check_availability(element, collection: iter):
    return element in collection

Употреба

check_availability('a', [1,2,3,4,'a','b','c'])

Смятам, че това е най-бързият начин да разберете дали избрана стойност се намира в масив.

Коментари (5)