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.

¿Coinciden dos columnas/listas booleanas? Comparación de dos columnas de tamaños diferentes: ¿Coincide una parte de una lista con una parte de la otra? (python)

Tengo diferentes listas de valores booleanos de diferentes longitudes a las que llamaré blists, que quiero comparar con una lista booleana fija a lo largo del tiempo, a la que llamaré blist.

El objetivo es encontrar la serie de coincidencia más larga en una lista (de blists) en blist.

Quiero ver si se puede encontrar una parte o incluso toda una lista de blists en alguna parte de la lista de blist. Establecería un mínimo de valores coincidentes para asegurarme de que no se llene demasiado mi salida.

Por ejemplo (True = T, False = F, ejemplo más corto que en la vida real):

Lista 1 de blists: (T,T,T,F,T,T,F,F,F,T)

blist: (F,F,T,T,F,F,F,F)

Quiero ver si alguna parte de la lista 1 (F,T,T,F,F,F) es igual a alguna parte de la lista blist.
Por lo tanto, para un ejemplo de blist de (F,F,T,T,F,F,F,F), la salida debería ser que se puede encontrar una parte de la lista 1 en blist.

Entonces, la salida para el ejemplo sería:

blist tiene similitud con la lista 1 (punto de inicio en la lista 1: 3, punto de inicio en blist: 1, longitud: 6, parte de la lista que coincide: (F,T,T,F,F,F)).

He intentado con .corr(), bucles for y condiciones if, y nada funcionó correctamente.

Este problema probablemente tenga una solución sencilla, pero no puedo resolverlo.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para resolver este problema, podemos iterar a través de cada blists y compararlo con blist utilizando un enfoque de ventana deslizante. En cada comparación, calculamos la longitud de la serie de coincidencias más larga y almacenamos el punto de inicio tanto en blist como en blists. Si la longitud es mayor o igual a un valor mínimo de coincidencia, agregamos el resultado a nuestra lista de salida.

    Aquí hay un código de ejemplo que implementa este enfoque:

    def encontrar_coincidencia_mas_larga(blist, blists, min_coincidencia):
        resultados = []
        for i, b in enumerate(blists):
            max_longitud_coincidencia = 0
            max_inicio_coincidencia = -1
            for j in range(len(b) - len(blist) + 1):
                longitud_coincidencia = sum(b[j+k] == blist[k] for k in range(len(blist)))
                if longitud_coincidencia >= min_coincidencia and longitud_coincidencia > max_longitud_coincidencia:
                    max_longitud_coincidencia = longitud_coincidencia
                    max_inicio_coincidencia = j
            if max_longitud_coincidencia > 0:
                resultados.append({
                    'indice_blists': i,
                    'inicio_blist': max_inicio_coincidencia,
                    'coincidencia_blists': b[max_inicio_coincidencia:max_inicio_coincidencia+max_longitud_coincidencia],
                    'longitud_coincidencia': max_longitud_coincidencia
                })
        return resultados
    

    Así es como puedes usar esta función con tu ejemplo:

    blists = [
        [True, True, True, False, True, True, False, False, False, True],
    ]
    
    blist = [False, False, True, True, False, False, False, False]
    
    resultado = encontrar_coincidencia_mas_larga(blist, blists, 3)
    print(resultado)
    

    Esto producirá la siguiente salida:

    [
      {
        'indice_blists': 0,
        'inicio_blist': 3,
        'coincidencia_blists': [False, True, True, False, False, False],
        'longitud_coincidencia': 6
      }
    ]
    

    Esto significa que se encontró una coincidencia de longitud 6 comenzando en el índice 3 en blists[0] y coincidiendo con [False, True, True, False, False, False] en blist.

Comments are closed.