Qual é a maneira mais rápida de saber se um valor existe numa lista (uma lista com milhões de valores nela) e qual é o seu índice?
Eu sei que todos os valores da lista são únicos, como neste exemplo.
O primeiro método que eu tento é (3,8 segundos no meu código real):
a = [4,2,3,1,5,6]
if a.count(7) == 1:
b=a.index(7)
"Do something with variable b"
O segundo método que eu tento é (2x mais rápido: 1,9 segundos para o meu código real):
a = [4,2,3,1,5,6]
try:
b=a.index(7)
except ValueError:
"Do nothing"
else:
"Do something with variable b"
Métodos propostos pelo usuário Stack Overflow (2,74 segundos para o meu código real):
a = [4,2,3,1,5,6]
if 7 in a:
a.index(7)
No meu código real, o primeiro método leva 3,81 segundos e o segundo método leva 1,88 segundos. It'é uma boa melhoria, mas:
I'sou um principiante com Python/scripting, e existe uma maneira mais rápida de fazer as mesmas coisas e poupar mais tempo de processamento?
Explicação mais específica para a minha aplicação:
Na API do Blender eu posso acessar uma lista de partículas:
particles = [1, 2, 3, 4, etc.]
De lá, posso aceder à localização de uma partícula's:
particles[x].location = [x,y,z]
E para cada partícula eu testei se existe um vizinho, procurando cada local de partícula assim:
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
A forma mais clara e rápida de o fazer.
Você também pode considerar a utilização de um set
, mas a construção desse conjunto da sua lista pode levar mais tempo do que o teste de adesão mais rápido irá economizar. A única maneira de ter certeza é fazer um bom benchmark. (isto também depende de quais operações você precisa)
Você poderia colocar seus itens em um set`. As pesquisas de set são muito eficientes.
Tente:
s = set(a)
if 7 in s:
# do stuff
**edit*** Em um comentário você diz que gostaria de obter o índice do elemento. Infelizmente, os conjuntos não têm noção da posição do elemento. Uma alternativa é pré-selecionar sua lista e depois usar busca binária toda vez que você precisar encontrar um elemento.
def check_availability(element, collection: iter):
return element in collection
**Usagem***
check_availability('a', [1,2,3,4,'a','b','c'])
Acredito que esta é a maneira mais rápida de saber se um valor escolhido está em um array.