es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo verificar si los valores de un elemento o sus vecinos de valor (dentro de un rango establecido) existen en una lista.

Tengo una variable de datos, contiene muchas coordenadas [x,y]:

data = ([100,200],[250,110],[50,400]...)

Cuando recibo una nueva [x,y], la anexo a los datos:

data.append ([x_cor, y_cor])

PERO

Necesito filtrar las coordenadas “vecinas” (para evitar anexarlas), dentro de un conjunto personalizado “rango”.

Por ejemplo, si establezco un rango de 2, entonces necesito filtrar todas las coordenadas donde ya sea que la coordenada x o y sea la misma, o menor/mayor por 1 o 2 unidades, como por ejemplo:

101,200

100,199

248,111

50,400

y así sucesivamente…

Cuando el rango es solo 1, puedo hacerlo usando un IF y un booleano agregando todas las variaciones, así:

cord_exist = False 

if ([x_cor + 1, y_cor + 1]) in data: cord_exist = True
if ([x_cor - 1, y_cor - 1]) in data: cord_exist = True
if ([x_cor + 1, y_cor]) in data: cord_exist = True
if ([x_cor, y_cor + 1]) in data: cord_exist = True
if ([x_cor - 1, y_cor]) in data: cord_exist = True
if ([x_cor, y_cor - 1]) in data: cord_exist = True
if ([x_cor + 1, y_cor - 1]) in data: cord_exist = True
if ([x_cor - 1, y_cor + 1]) in data: cord_exist = True

if cord_exist == False: data.append ([x_cor, y_cor])

Esto es imposible de mantener si el rango es 2,3 o más.

¿Cómo podría resolver esto de manera que el rango se pueda ajustar libremente?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una solución para filtrar coordenadas dentro de un rango personalizado es usar un bucle para verificar todas las coordenadas en la variable de datos contra la nueva coordenada [x_cor, y_cor]. El bucle debe excluir la nueva coordenada de la verificación. Para cada coordenada, podemos calcular la diferencia absoluta entre su coordenada x y la nueva coordenada x, y hacer lo mismo para la coordenada y. Si alguna de las diferencias es menor o igual al rango personalizado, podemos omitir la adición de la nueva coordenada a los datos. Aquí hay un ejemplo de implementación para un rango personalizado de 2:

    rango_personalizado = 2
    for coord in data:
        if abs(coord[0] - x_cor) <= rango_personalizado and abs(coord[1] - y_cor) <= rango_personalizado:
            # las coordenadas están dentro del rango personalizado
            break
    else:
        data.append([x_cor, y_cor])
    

    El bucle for-else ejecutará el bloque else si el bucle sale naturalmente sin una interrupción, lo que indica que todas las coordenadas en los datos están fuera del rango personalizado. La nueva coordenada se agrega a los datos.

Comments are closed.