Mam listę zestawów podaną przez,
sets1 = [{1},{2},{1}]
Kiedy znajduję unikalne elementy na tej liście za pomocą numpy unique
, otrzymuję
np.unique(sets1)
Out[18]: array([{1}, {2}, {1}], dtype=object)
Jak można zobaczyć, wynik jest błędny, jak {1}
powtarza się na wyjściu.
Kiedy zmieniam kolejność na wejściu, tworząc podobne elementy obok siebie, tak się nie dzieje.
sets2 = [{1},{1},{2}]
np.unique(sets2)
Out[21]: array([{1}, {2}], dtype=object)
Dlaczego tak się dzieje? Czy może coś jest nie tak z moim postępowaniem?
sets1.sort()
nie zmienia kolejności listy. Myślę, że musisz utworzyć funkcjęf
do sortowania zestawów na podstawie dowolnych kryteriów, a następnie przejśćsets1.sort(key=f)
donp.unique()
Odpowiedzi:
To, co się tutaj dzieje, polega na tym, że
np.unique
funkcja jest oparta nanp._unique1d
funkcji z NumPy (patrz kod tutaj ), która sama używa tej.sort()
metody.Teraz sortowanie listy zestawów zawierających tylko jedną liczbę całkowitą w każdym zestawie nie spowoduje utworzenia listy z każdym zestawem uporządkowanym według wartości liczby całkowitej znajdującej się w zestawie. Więc będziemy mieli (i nie tego chcemy):
Teraz, jak wskazałeś, jeśli lista zestawów jest już uporządkowana w pożądany sposób,
np.unique
będzie działać (ponieważ wcześniej posortowałeś listę).Jedno konkretne rozwiązanie (należy jednak pamiętać, że będzie działać tylko dla listy zestawów, z których każdy zawiera jedną liczbę całkowitą), to:
źródło
Dzieje się tak, ponieważ zestaw jest typem nieukrywalnym
możesz użyć Pythona,
collections.Counter
jeśli możesz przekonwertować zestaw na krotkę jak poniżejźródło
is
testowanie nie ma związku z hashowaniem. Brak mieszalności nie jest przyczyną, że np.unique () nie działa na zestawach: zgodnie z przyjętą odpowiedzią przyczyną jest brak całkowitego uporządkowania. Użycie tuple () na zestawach nie gwarantuje uporządkowania danych wyjściowych, więc dwa zestawy z tymi samymi elementami mogą niepoprawnie zostać przekonwertowane na różne krotki.