como formar grupos con los componentes de una lista

Chema Cortes pych3m4 en gmail.com
Mie Ago 27 13:34:18 CEST 2008


El día 26 de agosto de 2008 18:54, Francisco Santoyo Santos
<patximotxo en yahoo.es> escribió:
> tengo el siguiente problema:
>
> lista = [['1', '2'], ['5', '11'], ['11', '7'], ['8', '6'], ['4', '5'], ['8', '9'], ['3', '1']]
>
> ahora quiero hacer una lista compuesta de sublistas, cada una de las cuales contenga las sublistas que en la primera lista contenian elementos comunes en alguna de las dos posiciones. Es decir, obtener algo así;
>
> lista2 = [[['1', '2'],  ['3', '1']], [['5', '11'],  ['11', '7'],  ['4', '5']], [['8', '6'], ['8', '9']]]
>
> Vosotros como lo hariais?
> A mi no se me ocurre, newbie power XD

Sin duda que habrá muchas maneras. Aquí te pongo una "elegante",
aunque me temo que te va a costar entenderla:

#iterador que devuelve pares compuestos por un item y una lista de los
items que le siguen
def restos(lista):
    l=lista[:] #copia de trabajo
    while l:
        yield l.pop(0),l


lista2= [ (x,y) for (x,resto) in restos(lista) for y in resto
        if any(i for i in x if i in y)
    ]


Supongo que te costará entenderlo. Te poco una versión menos
optimizada, pero más comprensible:

lista2=[]
for i in range(len(lista)):
    x=lista[i]
    for y in lista[i+1:]:
        if any(i for i in x if i in y):
            lista.append([x,y])


Lo único raro te será el any(), que usa un iterador como argumento. Si
no lo entiendes, después de revisar la documentación, no dudes en
preguntarnos.
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes





Más información sobre la lista de distribución Python-es