Най-бърз начин за проверка дали дадена стойност съществува в списък
Кой е най-бързият начин да разберете дали дадена стойност съществува в списък (списък с милиони стойности) и какъв е нейният индекс?
Знам, че всички стойности в списъка са уникални, както в този пример.
Първият метод, който опитах, е (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])
Най-ясният и бърз начин да го направите.
Можете също така да помислите за използване на
set
, но конструирането на това множество от вашия списък може да отнеме повече време, отколкото ще спести по-бързото тестване на членството. Единственият начин да сте сигурни е да направите добър сравнителен анализ. (това зависи и от това какви операции ви трябват)Можете да поставите елементите си в
set
. Търсенето на множества е много ефективно.Опитайте:
редактиране В коментар казвате, че бихте искали да получите индекса на елемента. За съжаление множествата нямат понятие за позиция на елемента. Алтернативата е да сортирате списъка си предварително и след това да използвате двоично търсене всеки път, когато трябва да намерите елемент.
Употреба
Смятам, че това е най-бързият начин да разберете дали избрана стойност се намира в масив.