A melhor maneira de fazer isso é ordenando as listas e comparando-as. (O uso Counter
não funcionará com objetos que não são laváveis.) Isso é simples para números inteiros:
sorted(a) == sorted(b)
Fica um pouco mais complicado com objetos arbitrários. Se você se importa com a identidade do objeto, ou seja, se os mesmos objetos estão nas duas listas, você pode usar a id()
função como chave de classificação.
sorted(a, key=id) == sorted(b, key==id)
(No Python 2.x, você realmente não precisa do key=
parâmetro, porque é possível comparar qualquer objeto a qualquer objeto. A ordem é arbitrária, mas estável, portanto funciona bem para esse propósito; não importa em que ordem os objetos estejam. No entanto, no Python 3, comparar objetos de tipos diferentes não é permitido em muitas circunstâncias - por exemplo, você não pode comparar cadeias de caracteres com números inteiros - portanto, se você tiver objetos de vários tipos, melhor usar explicitamente o ID do objeto.)
Se você deseja comparar os objetos da lista por valor, por outro lado, primeiro precisa definir o que "valor" significa para os objetos. Então você precisará de alguma maneira de fornecer isso como uma chave (e para o Python 3, como um tipo consistente). Uma maneira potencial que funcionaria para muitos objetos arbitrários é classificar por eles repr()
. Obviamente, isso poderia desperdiçar muito tempo extra e repr()
seqüências de construção de memória para listas grandes e assim por diante.
sorted(a, key=repr) == sorted(b, key==repr)
Se os objetos são todos do seu próprio tipo, você pode defini __lt__()
-los para que o objeto saiba como se comparar a outros. Então você pode apenas classificá-los e não se preocupar com o key=
parâmetro. Claro que você também pode definir __hash__()
e usar Counter
, o que será mais rápido.