Bir değerin listede var olup olmadığını kontrol etmenin en hızlı yolu

Bir listede (içinde milyonlarca değer olan bir liste) bir değerin var olup olmadığını ve indeksinin ne olduğunu öğrenmenin en hızlı yolu nedir?

Listedeki tüm değerlerin bu örnekte olduğu gibi benzersiz olduğunu biliyorum.

Denediğim ilk yöntem (gerçek kodumda 3,8 sn):

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

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

Denediğim ikinci yöntem (2 kat daha hızlı: gerçek kodum için 1,9 saniye):

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

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

Stack Overflow kullanıcısından önerilen yöntemler (gerçek kodum için 2,74 saniye):

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

Gerçek kodumda, ilk yöntem 3,81 saniye, ikinci yöntem ise 1,88 saniye sürüyor. Bu iyi bir gelişme, ancak:

Python/komut dosyası yazmaya yeni başladım ve aynı şeyleri yapmanın ve daha fazla işlem süresi kazanmanın daha hızlı bir yolu var mı?

Benim başvurum için daha spesifik açıklama:

Blender API'sinde parçacıkların bir listesine erişebiliyorum:

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

Oradan bir parçacığın konumuna erişebiliyorum:

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

Ve her parçacık için, her parçacık konumunu şu şekilde arayarak bir komşunun var olup olmadığını test ediyorum:

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])
Çözüm
7 in a

Bunu yapmanın en açık ve en hızlı yolu.

Bir set kullanmayı da düşünebilirsiniz, ancak listenizden bu seti oluşturmak, daha hızlı üyelik testinin kazandıracağından daha fazla zaman alabilir. Emin olmanın tek yolu iyi bir kıyaslama yapmaktır. (bu aynı zamanda hangi işlemlere ihtiyaç duyduğunuza da bağlıdır)

Yorumlar (7)

Öğelerinizi bir set içine koyabilirsiniz. Set aramaları çok verimlidir.

Dene:

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

düzenle Bir yorumda, öğenin dizinini almak istediğinizi söylüyorsunuz. Ne yazık ki, kümelerin öğe konumu kavramı yoktur. Bir alternatif, listenizi önceden sıralamak ve ardından bir öğeyi bulmanız gerektiğinde binary search kullanmaktır.

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

Kullanım

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

Seçilen bir değerin bir dizide olup olmadığını anlamanın en hızlı yolunun bu olduğuna inanıyorum.

Yorumlar (5)