Często używam klas namedtuple. Zastanawiam się dzisiaj, czy istnieje dobry sposób wdrożenia niestandardowego sortowania dla takiej klasy, tj. Uczynienie domyślnego klucza sortowania nie pierwszym elementem (potem drugim, trzecim itd.) O nazwietakle.Niestandardowe sortowanie w klasie o nazwie zwanej pon.
Moim pierwszym odruchem było wdrożenie __lt__
i __eq__
i niech total_ordering
zrobić resztę (to wypełnia le, ne, gt, GE):
from collections import namedtuple
from functools import total_ordering
@total_ordering
class B(namedtuple('B', 'x y')):
def __lt__(self, other):
return self.y < other.y
Jednakże:
def test_sortingB():
b1 = B(1, 2)
b2 = B(2, 1)
assert b2 < b1 # passes
assert b2 <= b1 # fails
oh, prawo ... total_ordering
wypełnia tylko inne metody if they are missing. Ponieważ tuple/namedtuple ma takie metody, total_ordering nic nie robi dla mnie.
Więc myślę, że moje możliwości są
- zaprzestać używania namedtuple i po prostu stworzyć własną nudne lekcje, nadal używać total_ordering
- nadal korzystać namedtuple i wdrożyć wszystkie 6 metod porównywania
- nadal korzystać namedtuple i włóż wartość sortowania jako pierwsze pole. Na szczęście nie mam zbyt wielu instancji klasy, ale zazwyczaj polegam tylko na kolejności pól, aby je zainicjować, co może być nieprzyjemne. Może to zły nawyk.
Sugestie dotyczące najlepszego sposobu rozwiązania tego problemu?
Dlaczego po prostu nie utworzysz nazwy z polami w kolejności, według której chcesz sortować? – BrenBarn
Nie zdawałem sobie sprawy, że chciałbym posortować/zmaksymalizować itd., Dopóki nie utworzyłem go i użyłem go przez jakiś czas. Mogę więc dodać pole wiodące jako pole sortowania, ale może to być trochę uciążliwe. – pfctdayelise
Ale w jaki sposób używasz namedtuple?Dobrą rzeczą w przypadku namedtuple jest to, że umożliwia dostęp do elementów po nazwie, dzięki czemu możesz zmienić swoją nazwanątę, aby pola były we właściwej kolejności i nie wpłynęły na twój kod, o ile będziesz mieć dostęp do pól po nazwie (która prawdopodobnie robi, czy też dlaczego używał namedtuple?). – BrenBarn