¿Cuál es la forma más rápida de saber si un valor existe en una lista (una lista con millones de valores) y cuál es su índice?
Sé que todos los valores de la lista son únicos como en este ejemplo.
El primer método que pruebo es (3,8 seg en mi código real):
a = [4,2,3,1,5,6]
if a.count(7) == 1:
b=a.index(7)
"Do something with variable b"
El segundo método que pruebo es (2 veces más rápido: 1,9 seg en mi 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 propuestos por el usuario de Stack Overflow (2.74 seg para mi código real):
a = [4,2,3,1,5,6]
if 7 in a:
a.index(7)
En mi código real, el primer método tarda 3,81 seg y el segundo tarda 1,88 seg. Es una buena mejora, pero:
Soy un principiante con Python/scripting, y ¿hay una manera más rápida de hacer las mismas cosas y ahorrar más tiempo de procesamiento?
Explicación más específica para mi aplicación:
En la API de Blender puedo acceder a una lista de partículas:
particles = [1, 2, 3, 4, etc.]
Desde ahí, puedo acceder a la ubicación de una partícula':
particles[x].location = [x,y,z]
Y para cada partícula compruebo si existe un vecino buscando la ubicación de cada partícula así
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
La forma más clara y rápida de hacerlo.
También puede considerar la posibilidad de utilizar un conjunto
, pero la construcción de ese conjunto a partir de su lista puede llevar más tiempo del que le ahorrarán las pruebas de afiliación más rápidas. La única manera de estar seguro es hacer un buen benchmark. (esto también depende de las operaciones que necesites)
Podrías poner tus elementos en un set
. Las búsquedas de conjuntos son muy eficientes.
Inténtalo:
s = set(a)
if 7 in s:
# do stuff
edit En un comentario dices que te gustaría obtener el índice del elemento. Por desgracia, los conjuntos no tienen ninguna noción de la posición del elemento. Una alternativa es preordenar tu lista y luego usar búsqueda binaria cada vez que necesites encontrar un elemento.
def check_availability(element, collection: iter):
return element in collection
Uso
check_availability('a', [1,2,3,4,'a','b','c'])
Creo que esta es la forma más rápida de saber si un valor elegido está en un array.