La meilleure façon d'y parvenir est de trier les listes et de les comparer. (L'utilisation Counter
ne fonctionnera pas avec des objets qui ne sont pas hachables.) C'est simple pour les entiers:
sorted(a) == sorted(b)
Cela devient un peu plus délicat avec des objets arbitraires. Si vous vous souciez de l'identité des objets, c'est-à-dire si les mêmes objets sont dans les deux listes, vous pouvez utiliser la id()
fonction comme clé de tri.
sorted(a, key=id) == sorted(b, key==id)
(En Python 2.x, vous n'avez pas réellement besoin du key=
paramètre, car vous pouvez comparer n'importe quel objet à n'importe quel objet. L'ordre est arbitraire mais stable, donc cela fonctionne bien à cette fin; peu importe l'ordre dans lequel les objets sont dans, seulement que l'ordre est le même pour les deux listes. En Python 3, cependant, la comparaison d'objets de types différents est interdite dans de nombreuses circonstances - par exemple, vous ne pouvez pas comparer des chaînes à des entiers - donc si vous avez des objets de différents types, il est préférable d'utiliser explicitement l'ID de l'objet.)
Si vous souhaitez comparer les objets de la liste par valeur, par contre, vous devez d'abord définir ce que signifie «valeur» pour les objets. Ensuite, vous aurez besoin d'un moyen de fournir cela en tant que clé (et pour Python 3, en tant que type cohérent). Un moyen potentiel qui fonctionnerait pour de nombreux objets arbitraires est de trier par leur repr()
. Bien sûr, cela pourrait perdre beaucoup de temps supplémentaire et de créer des repr()
chaînes de mémoire pour les grandes listes, etc.
sorted(a, key=repr) == sorted(b, key==repr)
Si les objets sont tous de vos propres types, vous pouvez les définir __lt__()
pour que l'objet sache se comparer aux autres. Ensuite, vous pouvez simplement les trier et ne pas vous soucier du key=
paramètre. Bien sûr, vous pouvez également définir __hash__()
et utiliser Counter
, ce qui sera plus rapide.