La mejor manera de hacerlo es ordenar las listas y compararlas. (El uso Counter
no funcionará con objetos que no sean hashaable). Esto es sencillo para los enteros:
sorted(a) == sorted(b)
Se vuelve un poco más complicado con objetos arbitrarios. Si le importa la identidad del objeto, es decir, si los mismos objetos están en ambas listas, puede usar la id()
función como la clave de clasificación.
sorted(a, key=id) == sorted(b, key==id)
(En Python 2.x en realidad no necesita el key=
parámetro, porque puede comparar cualquier objeto con cualquier objeto. El orden es arbitrario pero estable, por lo que funciona bien para este propósito; no importa el orden de los objetos) en, solo que el orden es el mismo para ambas listas. En Python 3, sin embargo, la comparación de objetos de diferentes tipos no está permitida en muchas circunstancias, por ejemplo, no puede comparar cadenas con enteros, por lo que si tendrá objetos de varios tipos, lo mejor es usar explícitamente la ID del objeto).
Si desea comparar los objetos en la lista por valor, por otro lado, primero debe definir qué significa "valor" para los objetos. Entonces necesitará alguna forma de proporcionar eso como una clave (y para Python 3, como un tipo consistente). Una forma potencial que funcionaría para muchos objetos arbitrarios es ordenarlos por ellos repr()
. Por supuesto, esto podría desperdiciar mucho tiempo extra y crear repr()
cadenas de memoria para listas grandes, etc.
sorted(a, key=repr) == sorted(b, key==repr)
Si los objetos son todos de su propio tipo, puede definirlos __lt__()
para que el objeto sepa cómo compararse con los demás. Luego puede ordenarlos y no preocuparse por el key=
parámetro. Por supuesto, también podría definir __hash__()
y usar Counter
, lo que será más rápido.