Der beste Weg, dies zu tun, besteht darin, die Listen zu sortieren und zu vergleichen. (Die Verwendung Counter
funktioniert nicht mit Objekten, die nicht hashbar sind.) Dies ist für Ganzzahlen unkompliziert:
sorted(a) == sorted(b)
Bei beliebigen Objekten wird es etwas kniffliger. Wenn Sie sich für die Objektidentität interessieren, dh ob sich in beiden Listen dieselben Objekte befinden, können Sie die id()
Funktion als Sortierschlüssel verwenden.
sorted(a, key=id) == sorted(b, key==id)
(In Python 2.x benötigen Sie das eigentlich nicht key=
Parameter , da Sie jedes Objekt mit jedem Objekt vergleichen können. Die Reihenfolge ist willkürlich, aber stabil, daher funktioniert es für diesen Zweck einwandfrei. Es spielt keine Rolle, in welcher Reihenfolge die Objekte sind nur, dass die Reihenfolge für beide Listen gleich ist. In Python 3 ist das Vergleichen von Objekten unterschiedlichen Typs jedoch unter vielen Umständen nicht zulässig. Beispielsweise können Sie Zeichenfolgen nicht mit Ganzzahlen vergleichen. Wenn Sie also Objekte haben von verschiedenen Typen, am besten explizit die ID des Objekts verwenden.)
Wenn Sie die Objekte in der Liste nach Wert vergleichen möchten, müssen Sie zunächst definieren, was "Wert" für die Objekte bedeutet. Dann benötigen Sie eine Möglichkeit, dies als Schlüssel bereitzustellen (und für Python 3 als konsistenten Typ). Ein möglicher Weg, der für viele beliebige Objekte funktionieren würde, besteht darin, nach ihren zu sortieren repr()
. Dies könnte natürlich viel zusätzliche Zeit und Speicheraufbau repr()
für große Listen usw. verschwenden .
sorted(a, key=repr) == sorted(b, key==repr)
Wenn die Objekte alle Ihre eigenen Typen sind, können Sie sie definieren __lt__()
, damit das Objekt weiß, wie es sich mit anderen vergleicht. Dann können Sie sie einfach sortieren und sich nicht um den key=
Parameter kümmern . Natürlich können Sie auch definieren __hash__()
und verwenden Counter
, was schneller sein wird.