Кой е най-бързият начин да разберете дали дадена стойност съществува в списък (списък с милиони стойности) и какъв е нейният индекс?
Знам, че всички стойности в списъка са уникални, както в този пример.
Първият метод, който опитах, е (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
, но конструирането на това множество от вашия списък може да отнеме повече време, отколкото ще спести по-бързото тестване на членството. Единственият начин да сте сигурни е да направите добър сравнителен анализ. (това зависи и от това какви операции ви трябват)
Можете да поставите елементите си в set
. Търсенето на множества е много ефективно.
Опитайте:
s = set(a)
if 7 in s:
# do stuff
редактиране В коментар казвате, че бихте искали да получите индекса на елемента. За съжаление множествата нямат понятие за позиция на елемента. Алтернативата е да сортирате списъка си предварително и след това да използвате двоично търсене всеки път, когато трябва да намерите елемент.
def check_availability(element, collection: iter):
return element in collection
Употреба
check_availability('a', [1,2,3,4,'a','b','c'])
Смятам, че това е най-бързият начин да разберете дали избрана стойност се намира в масив.