Najlepszym sposobem na to jest sortowanie list i porównywanie ich. (Użycie Counter
nie zadziała z obiektami, które nie są hashowane). Jest to proste w przypadku liczb całkowitych:
sorted(a) == sorted(b)
Trochę trudniej jest z przypadkowymi obiektami. Jeśli zależy Ci na tożsamości obiektu, tj. Czy te same obiekty znajdują się na obu listach, możesz użyć id()
funkcji jako klucza sortowania.
sorted(a, key=id) == sorted(b, key==id)
(W Pythonie 2.x nie potrzebujesz tego key=
parametru, ponieważ możesz porównać dowolny obiekt z dowolnym obiektem. Kolejność jest dowolna, ale stabilna, więc działa dobrze w tym celu; nie ma znaczenia, w jakiej kolejności są obiekty in, tylko że kolejność jest taka sama dla obu list. Jednak w Pythonie 3 porównywanie obiektów różnych typów jest w wielu przypadkach niedozwolone - na przykład nie możesz porównywać łańcuchów z liczbami całkowitymi - więc jeśli będziesz mieć obiekty różnych typów, najlepiej jawnie użyć identyfikatora obiektu).
Z drugiej strony, jeśli chcesz porównać obiekty na liście według wartości , najpierw musisz zdefiniować, co oznacza „wartość” dla obiektów. Wtedy będziesz potrzebował jakiegoś sposobu, aby podać go jako klucz (a dla Pythona 3 jako spójny typ). Jednym z potencjalnych sposobów działania w przypadku wielu dowolnych obiektów jest sortowanie według ich repr()
. Oczywiście może to zmarnować dużo dodatkowego czasu i repr()
ciągów budujących pamięć dla dużych list i tak dalej.
sorted(a, key=repr) == sorted(b, key==repr)
Jeśli wszystkie obiekty są twoimi własnymi typami, możesz __lt__()
na nich zdefiniować, aby obiekt wiedział, jak porównywać się z innymi. Następnie możesz je po prostu posortować i nie martwić się o key=
parametr. Oczywiście możesz także zdefiniować __hash__()
i użyć Counter
, co będzie szybsze.