Najszybszy sposób na sprawdzenie, czy wartość istnieje na liście

Jaki jest najszybszy sposób, aby dowiedzieć się, czy dana wartość istnieje na liście (lista z milionami wartości) i jaki jest jej indeks?

Wiem, że wszystkie wartości na liście są unikalne, jak w tym przykładzie.

Pierwsza metoda, którą próbuję, to (3,8 s w moim prawdziwym kodzie):.

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

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

Druga metoda, którą wypróbowuję jest (2x szybsza: 1.9 sek w moim prawdziwym kodzie):

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

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

Proponowane metody od użytkownika Stack Overflow (2,74 s dla mojego prawdziwego kodu):

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

W moim prawdziwym kodzie pierwsza metoda zajmuje 3,81 s, a druga metoda zajmuje 1,88 s. To'jest dobra poprawa, ale:

I'm początkujący z Pythonem / skryptami, i czy istnieje szybszy sposób na zrobienie tych samych rzeczy i zaoszczędzenie więcej czasu przetwarzania?

Bardziej szczegółowe wyjaśnienie dla mojej aplikacji: .

W API Blendera mogę uzyskać dostęp do listy cząsteczek:

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

Stamtąd mogę uzyskać dostęp do lokalizacji cząsteczki:

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

I dla każdej cząstki testuję, czy istnieje sąsiad, przeszukując lokalizację każdej cząstki w ten sposób:

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])
Rozwiązanie
7 in a

Najczystszy i najszybszy sposób na zrobienie tego.

Możesz również rozważyć użycie set, ale skonstruowanie tego zestawu z twojej listy może zająć więcej czasu niż szybsze testowanie członkostwa zaoszczędzi. Jedynym sposobem, aby być pewnym, jest dobre benchmarkowanie. (to również zależy od tego, jakich operacji potrzebujesz)

Komentarze (7)

Możesz umieścić swoje elementy w set. Odszukiwanie zbiorów jest bardzo wydajne.

Spróbuj:

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

edit W komentarzu piszesz, że chciałbyś uzyskać indeks elementu. Niestety, zestawy nie mają pojęcia pozycji elementu. Alternatywą jest wstępne posortowanie listy, a następnie użycie binary search za każdym razem, gdy musisz znaleźć element.

Komentarze (3)
def check_availability(element, collection: iter):
    return element in collection

Użycie

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

Uważam, że jest to najszybszy sposób, aby dowiedzieć się, czy wybrana wartość znajduje się w tablicy.

Komentarze (5)