with tutorial the para latest framework español desde cero applications python python-2.7 set unique itertools

python - tutorial - the django project



manteniendo solo instancias únicas de listas cuya única diferencia es el orden (2)

En lugar de verificar el tamaño del conjunto, como lo hace, almacene cada uno de ellos, también en un conjunto (hace que la búsqueda sea simple).

Luego, compruebe si ya conoce el set(x) ; si lo hace, sáltelo; de lo contrario, colóquelo en el conjunto de conjuntos conocidos.

Para almacenar un conjunto en un conjunto, debe hacer que el conjunto interno sea inmutable, usando frozenset lugar de set .

Código de trabajo:

from itertools import product list1 = [''Gabe'', ''Taylor'', ''Kyle'', ''Jay''] list2 = [''Gabe'', ''Taylor'', ''Kyle'', ''Jay'', ''James'', ''John'', ''Tyde'',''Chris'', ''Bruno'', ''David''] list3 = [''Gabe'', ''Taylor'', ''Kyle'', ''Jay'', ''James'', ''John'', ''Tyde'',''Chris'', ''Bruno'', ''David''] list4 = [''Kyle'', ''James'', ''John'', ''Tyde'',''Bruno'', ''Drew'', ''Chris''] list5 = [''James'', ''John'', ''Brendan'',''Tim'', ''Drew'' ] def FindUniques(*lists): already_seen = set() result = [] for x in product(*lists): icicle = frozenset(x) if icicle not in already_seen: result.append(x) already_seen.add(icicle) return result final_list = FindUniques(list1, list2, list3, list4, list5) # make sure that each element in final_list, independent of elemet order, is unique assert len(final_list) == len(set(tuple(sorted(list(x))) for x in final_list)) # to print for x in final_list: print x

Usando este código:

from itertools import product list1 = [''Gabe'', ''Taylor'', ''Kyle'', ''Jay''] list2 = [''Gabe'', ''Taylor'', ''Kyle'', ''Jay'', ''James'', ''John'', ''Tyde'',''Chris'', ''Bruno'', ''David''] list3 = [''Gabe'', ''Taylor'', ''Kyle'', ''Jay'', ''James'', ''John'', ''Tyde'',''Chris'', ''Bruno'', ''David''] list4 = [''Kyle'', ''James'', ''John'', ''Tyde'',''Bruno'', ''Drew'', ''Chris''] list5 = [''James'', ''John'', ''Brendan'',''Tim'', ''Drew'' ] FinalList = [] for x in product(list1, list2, list3, list4, list5): # check for duplicates if len(set(x)) == 5: FinalList.append(x) # to print for x in FinalList: print x

Imprimo todas las listas únicas. Sin embargo, muchas de las listas impresas son únicas solo porque son los mismos elementos en un orden diferente.

¿Cómo puedo cambiar mi código para que solo imprima una lista si todavía no se ha impreso y ordenado de manera diferente?


frozenset es manejable y no le importa el orden de su contenido. Simplemente use un conjunto en lugar de una lista para su final_data y las entradas con los mismos nombres en diferentes órdenes se fusionarán en una entrada en final_data :

final_data = set() for x in product(list1, list2, list3, list4, list5): datum = frozenset(x) if len(datum) == 5: final_data.add(datum)