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)