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.

¿Procesar una lista de listas para encontrar todas las listas que tengan valores coincidentes en el último elemento?

Dado una lista de listas:

lol = [[0,a], [0,b],
       [1,b], [1,c],
       [2,d], [2,e],
       [2,g], [2,b],
       [3,e], [3,f]]

Me gustaría extraer todos los subconjuntos que tengan el mismo último elemento (lol[n][1]) y quedarme con algo como esto:

[0,b]
[1.b]
[2,b]
[2,e]
[3,e]

Sé que dadas dos listas se puede usar una intersección, ¿cuál es la mejor manera de abordar un problema como este, aparte de incrementar el valor del índice en un ciclo “for each”?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Una manera de abordar este problema es utilizando un diccionario para agrupar las sub-listas según su último elemento. Podemos iterar a través de la lista de listas y, para cada sublista, verificar si su último elemento ya es una clave en el diccionario. Si lo es, agregamos la sublista a la lista de valores correspondiente en el diccionario. Si no lo es, creamos una nueva clave en el diccionario con el último elemento como su valor y asignamos la sublista actual a su lista de valores correspondiente. Finalmente, podemos extraer los valores del diccionario y devolverlos como una lista de listas.

    Aquí está el código para implementar este enfoque:

    def extraer_sublistas(lol):
        sublistas = {}
        for sublist in lol:
            clave = sublist[1] # último elemento de la sublista
            if clave en sublistas:
                sublistas[clave].append(sublist)
            else:
                sublistas[clave] = [sublist]
        return [valor for valor in sublistas.values()]
    
    # Ejemplo de uso
    lol = [[0,'a'], [0,'b'], [1,'b'], [1,'c'],
           [2,'d'], [2,'e'], [2,'g'], [2,'b'], [3,'e'], [3,'f']]
    resultado = extraer_sublistas(lol)
    print(resultado) # Salida: [[0, 'b'], [1, 'b'], [2, 'd'], [2, 'e'], [2, 'g'], [2, 'b'], [3, 'e']]
    

    Tenga en cuenta que la lista resultante de listas incluye todas las sub-listas que tienen el mismo último elemento, no solo las que aparecen más de una vez. Si desea filtrar las sub-listas únicas, podría modificar la función para devolver solo los valores con una longitud mayor que 1:

    def extraer_duplicados(lol):
        sublistas = {}
        for sublist in lol:
            clave = sublist[1]
            if clave in sublistas:
                sublistas[clave].append(sublist)
            else:
                sublistas[clave] = [sublist]
        return [valor for valor in sublistas.values() if len(valor) > 1]
    
    # Ejemplo de uso
    lol = [[0,'a'], [0,'b'], [1,'b'], [1,'c'],
           [2,'d'], [2,'e'], [2,'g'], [2,'b'], [3,'e'], [3,'f']]
    resultado = extraer_duplicados(lol)
    print(resultado) # Salida: [[0, 'b'], [1, 'b'], [2, 'e'], [2, 'b'], [3, 'e']]
    

Comments are closed.