python 사용자 정의 클래스 정렬 가능, 해시 가능하게 만들기
python에서 사용자 정의 클래스를 정렬 및/또는 해시 가능하게 할 때 재정의/구현해야 하는 방법은 무엇입니까?
조심해야 할 고차는 무엇입니까?
I형dir({})
내 통역사에게 입력하여 내장된 딕트에 대한 방법 목록을 가져옵니다.그 중에서, 저는 몇 가지 부분 집합을 구현해야 한다고 생각합니다.
['__cmp__', '__eq__', '__ge__', '__gt__', '__hash__', '__le__', '__lt__', '__ne__']
Python2와 반대로 Python3에 대해 구현해야 하는 방법에 차이가 있습니까?
다른 답변에 댓글로 올릴 뻔했는데 그 자체가 답입니다.
항목을 정렬할 수 있도록 하려면 항목을 구현하기만 하면 됩니다.__lt__
그것이 내장된 정렬에서 사용하는 유일한 방법입니다.
다른 비교 또는functools.total_ordering
클래스와 비교 연산자를 실제로 사용하려는 경우에만 필요합니다.
항목을 해시 가능하게 만들려면 다음을 구현합니다.__hash__
다른 사람들이 지적한 바와 같이또한 다음을 구현해야 합니다.__eq__
호환되는 방식으로 - 동등한 항목은 동일하게 해시해야 합니다.
파이썬 2와 3은 차이가 없습니다.
정렬 가능성:
비교 방법을 정의해야 합니다.이렇게 하면 항목을 정렬할 수 있습니다.일반적으로, 당신은 선호하지 말아야 합니다.__cmp__()
.
저는 주로 functools.total_ordering 데코레이터를 사용합니다.
functools.total_ordering(cls) 하나 이상의 리치 비교 순서 메서드를 정의하는 클래스가 주어지면 이 클래스 장식자는 나머지를 제공합니다.따라서 가능한 리치 비교 작업을 모두 지정하는 데 필요한 작업이 간소화됩니다.
클래스는 다음 중 하나를 정의해야 합니다.
__lt__()
,__le__()
,__gt__()
또는__ge__()
또한, 클래스는 다음을 제공해야 합니다.__eq__()
방법.
비교 방법에 부작용이 없도록 주의해야 합니다.(객체의 값 중 하나를 변경합니다.
해시의 경우:
구현해야 합니다.__hash__()
방법.내 생각에 가장 좋은 방법은 돌아오는 것입니다.hash(repr(self))
그래서 당신의 해시는 독특할 것입니다.
개체를 정렬 가능으로 표시하는 몇 가지 방법이 있습니다.함수 집합에 의해 정의되는 첫 번째 - 리치 비교:
object.__lt__(self, other)
object.__le__(self, other)
object.__eq__(self, other)
object.__ne__(self, other)
object.__gt__(self, other)
object.__ge__(self, other)
또한 하나의 함수만 정의할 수 있습니다.
object.__cmp__(self, other)
사용자 지정을 정의하려면 마지막을 정의해야 합니다.__hash__
기능.의사를 참조하십시오.
시행하다__lt__(self,other)
메소드는 클래스를 정렬할 수 있도록 하는 답입니다.
내장된 방식뿐만 아니라sorted(iterable)
또우 순위대를 통한 큐:heapq
모듈.
파이썬의에 들지 않아서 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ'__ge__', '__gt__', '__le__', '__lt__', '__ne__'
방법은 전혀 직관적이지 않습니다!
대으로적, 의바자조.Interface Comparable<T>
(java doc 참조) 이 개체가 직접적이고 친숙한 지정된 개체보다 작거나 같거나 크기 때문에 음수 정수, 0 또는 양수를 반환합니다!
언급URL : https://stackoverflow.com/questions/7152497/making-a-python-user-defined-class-sortable-hashable
'programing' 카테고리의 다른 글
JPA - EclipseLink - 기본 스키마를 변경하는 방법 (0) | 2023.08.19 |
---|---|
Xampp가 예기치 않게 종료하기 전에 SQL을 시작합니다.효과적인 해결책이 없는 것 같습니다. (0) | 2023.08.19 |
MariaDB EXPLE의 파이프 "|" 기호 (0) | 2023.08.19 |
MariaDB/InnoDB에서 ADD COLUMON AFTER를 실행할 때 위험이 있습니까? (0) | 2023.08.19 |
애플리케이션 풀 ID를 사용하는 IIS 애플리케이션에서 기본 토큰을 손실하시겠습니까? (0) | 2023.08.19 |