Python | Fusionar listas anidadas

Dadas dos listas anidadas, ‘lst1’ y ‘lst2’, escriba un programa Python para crear una nueva lista anidada ‘lst3’ a partir de las dos listas anidadas dadas, de modo que la nueva lista anidada conste de intersecciones comunes de ambas listas, así como de la elementos que no se cruzan.

Ejemplos: 

Input : lst1 = [[5, 9], [8, 2, 6], [3, 4]]
        lst2 = [[9, 5, 8], [2, 6], [3, 4, 1]]
Output : [[9, 5], [8], [2, 6], [3, 4], [1]]

Input : lst1 = [['a', 'b', 'c'], ['x']]
        lst2 = [['b', 'c', 'y'], ['x', 'y']]
Output : [['b', 'c'], ['x'], ['y'], ['a']]

Enfoque n.° 1: por intersección establecida usando functools.reduce()
Este método usa la intersección establecida para calcular cada intersección, luego agrega cualquier elemento que quede (es decir, los elementos que aparecen en solo una de las dos listas). Primero usaremos functools.reduce() para generar elementos únicos de ‘lst1’ y ‘lst2’ y guardarlos en ‘temp1’ y ‘temp2’ respectivamente. Después de esto, encuentre la intersección establecida de ambas listas en ‘lst3’. Por último, encuentre la diferencia simétrica de ‘lst1’ y ‘lst2’, que produce los elementos que aparecen en solo uno de los 2 conjuntos y agréguelos a ‘lst3’.

Python3

# Python3 program to find Greatest common
# intersection of two nested lists
import itertools
import functools
 
def GCI(lst1, lst2):
     
    temp1 = functools.reduce(lambda a, b: set(a).union(set(b)), lst1)
    temp2 = functools.reduce(lambda a, b: set(a).union(set(b)), lst2)
     
    lst3 = [list(set(a).intersection(set(b)))
           for a, b in itertools.product(lst1, lst2)
           if len(set(a).intersection(set(b))) != 0]
     
    lst3.extend([x] for x in temp1.symmetric_difference(temp2))
     
    return lst3
         
# Driver code
lst1 = [[5, 9], [8, 2, 6], [3, 4]]
lst2 = [[9, 5, 8], [2, 6], [3, 4, 1]]
print(GCI(lst1, lst2))
Producción: 

[[9, 5], [8], [2, 6], [3, 4], [1]]

 

 
Enfoque n.° 2: por intersección establecida usando filtro
Este es un enfoque eficiente sobre el enfoque n.° 1, ya que simplifica la intersección. Primero, aplane las listas anidadas. Tome Intersección usando filter() y guárdelo en ‘lst3’. Ahora busque elementos que no estén en lst1 o en lst2, y guárdelos en ‘temp’. Finalmente, agregue ‘temp’ a ‘lst3’. 

Python3

# Python3 program to find Greatest common
# intersection of two nested lists
import itertools
from functools import reduce
 
def GCI(lst1, lst2):
     
    temp1 = reduce(list.__add__, lst1)
    temp2 = reduce(list.__add__, lst2)
    lst3 = list(filter(None, [list(set(o1) & set(o2))
                     for o1 in lst1 for o2 in lst2])) 
 
    temp = filter(lambda x : x not in temp1 or x not in temp2,
                                      set(temp1) | set(temp2))
    lst3.append(list(temp))
     
    return lst3
         
# Driver code
lst1 = [[5, 9], [8, 2, 6], [3, 4]]
lst2 = [[9, 5, 8], [2, 6], [3, 4, 1]]
print(GCI(lst1, lst2))
Producción: 

[[9, 5], [8], [2, 6], [3, 4], [1]]

 

Publicación traducida automáticamente

Artículo escrito por Smitha Dinesh Semwal y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *