Sin iterar sobre toda la matriz, ¿cómo puedo verificar si estoy x
en la matriz usando Go? ¿El lenguaje tiene una construcción?
Como Python: if "x" in array: ...
Sin iterar sobre toda la matriz, ¿cómo puedo verificar si estoy x
en la matriz usando Go? ¿El lenguaje tiene una construcción?
Como Python: if "x" in array: ...
strings.Index
) ayuda a que sea más obvio lo que está haciendo el código. Tengo la impresión de que quizás piensas que Pythonin array:
está haciendo algo rápido / mágico. AFAIK no lo es. Hacer explícito el bucle ayuda a que el escritor (y todos los lectores) conozcan y consideren otras implementaciones (por ejemplo, un mapa).Respuestas:
No hay un operador integrado para hacerlo en Go. Necesita iterar sobre la matriz. Puede escribir su propia función para hacerlo, así:
Si desea poder verificar la membresía sin iterar sobre la lista completa, debe usar un mapa en lugar de una matriz o un segmento, como este:
fuente
Otra solución si la lista contiene valores estáticos.
por ejemplo: verificar un valor válido de una lista de valores válidos:
fuente
Esta es una cita del libro "Programación en marcha: creación de aplicaciones para el siglo XXI":
https://play.golang.org/p/UIndYQ8FeW
fuente
n*log(n) + log(n)
, ya que son dos operaciones independientes consecuentesEl ejemplo anterior usando sort está cerca, pero en el caso de cadenas simplemente use SearchString:
https://golang.org/pkg/sort/#SearchStrings
fuente
sort.SearchStrings
.Simplemente tuve una pregunta similar y decidí probar algunas de las sugerencias en este hilo.
He comparado los mejores y peores escenarios de 3 tipos de búsqueda:
Aquí está el código de función:
los mejores escenarios seleccionan el primer elemento de las listas, los peores casos usan valores no existentes.
aquí están los resultados:
BenchmarkBelongsToMapWorstCase-4 2000000 787 ns/op BenchmarkBelongsToSwitchWorstCase-4 2000000000 0.35 ns/op BenchmarkBelongsToListWorstCase-4 100000000 14.7 ns/op BenchmarkBelongsToMapBestCase-4 2000000 683 ns/op BenchmarkBelongsToSwitchBestCase-4 100000000 10.6 ns/op BenchmarkBelongsToListBestCase-4 100000000 10.4 ns/op
Switch gana todo el camino, el peor de los casos es increíblemente más rápido que el mejor de los casos. Los mapas son lo peor y la lista está más cerca de cambiar.
Entonces, la moraleja es: si tiene una lista estática, razonablemente pequeña, la declaración de cambio es el camino a seguir.
fuente
:
lugar de,
en la declaración de cambio? ¿Lo hace más rápido?case
declaraciones en lugar de un solo caso. Los resultados son sensiblemente iguales con ambas funciones.Otra opción es usar un mapa como conjunto. Utiliza solo las teclas y hacer que el valor sea algo así como un booleano que siempre es cierto. Luego puede verificar fácilmente si el mapa contiene la clave o no. Esto es útil si necesita el comportamiento de un conjunto, donde si agrega un valor varias veces es solo en el conjunto una vez.
Aquí hay un ejemplo simple donde agrego números aleatorios como claves a un mapa. Si el mismo número se genera más de una vez, no importa, solo aparecerá en el mapa final una vez. Luego utilizo un simple if check para ver si una clave está en el mapa o no.
Aquí está en el patio de recreo
fuente
Esto es lo más cerca que puedo llegar a la sensación natural del operador "en" de Python. Tienes que definir tu propio tipo. Luego puede ampliar la funcionalidad de ese tipo agregando un método como "has" que se comporta como cabría esperar.
Tengo una biblioteca de utilidades donde defino algunas cosas comunes como esta para varios tipos de sectores, como los que contienen enteros o mis otras estructuras.
Sí, se ejecuta en tiempo lineal, pero ese no es el punto. El punto es preguntar y aprender qué construcciones de lenguaje común Go tiene y no tiene. Es un buen ejercicio. Si esta respuesta es tonta o útil depende del lector.
fuente