기계는 거짓말하지 않는다

Python Class 정렬, 정렬 기준 본문

Python

Python Class 정렬, 정렬 기준

KillinTime 2021. 8. 3. 15:07

클래스에 여러 인스턴스 변수의 기준에 따라 정렬할 때

비교함수 구현

# lt(a, b): a < b
operator.lt(a, b)
operator.__lt__(a, b)

# le(a, b): a <= b
operator.le(a, b)
operator.__le__(a, b)

# eq(a, b): a == b
operator.eq(a, b)
operator.__eq__(a, b)

# ne(a, b): a != b
operator.ne(a, b)
operator.__ne__(a, b)

# gt(a, b): a > b
operator.gt(a, b)
operator.__gt__(a, b)

ge(a, b): a >= b
operator.ge(a, b)
operator.__ge__(a, b)

# boolean 값으로 해석할 수도 있고,
# 그렇지 않은 임의의 값을 반환할 수도 있음
class TempClass:
    def __init__(self, string:str, index:int):
        if type(string) is not str: raise Exception("not string")
        if type(index) is not int: raise Exception("not integer")
        self.string = string
        self.index = index

    def __repr__(self):
        return self.string + "-" + str(self.index)

    def __str__(self):
        return self.string + "-" + str(self.index)

    def __gt__(self, obj):	# 정렬 기준
        if self.string == obj.string:
            return self.index > obj.index
        else:
            return self.string > obj.string

a = TempClass("A", 10)
b = TempClass("B", 5)
c = TempClass("C", 2)
aa = TempClass("A", 3)
aaa = TempClass("A", 7)
d = TempClass("D", 15)

tempClassList = [c, b, aaa, a, d, aa]
print(tempClassList)
sortedList = sorted(tempClassList)
print(sortedList)

Key 전달

class TempClass:
    def __init__(self, string:str, index:int):
        if type(string) is not str: raise Exception("not string")
        if type(index) is not int: raise Exception("not integer")
        self.string = string
        self.index = index

    def __repr__(self):
        return self.string + "-" + str(self.index)

    def __str__(self):
        return self.string + "-" + str(self.index)

a = TempClass("A", 10)
b = TempClass("B", 5)
c = TempClass("C", 2)
aa = TempClass("A", 3)
aaa = TempClass("A", 7)
d = TempClass("D", 15)

tempClassList = [c, b, aaa, a, d, aa]
print(tempClassList)
# key 전달
sortedList = sorted(tempClassList, key=lambda x: (x.string, x.index))
print(sortedList)

key=lambda x: (x.string, -x.index)로 변경하면 index는 내림차순으로 정렬됨

 

sorted 함수의 인자에 reverse=True를 추가하여 역순 정렬 가능

'Python' 카테고리의 다른 글

Python list 특정 길이, 값으로 초기화  (0) 2021.08.05
Python Numpy transpose  (0) 2021.08.04
Python Index Error  (0) 2021.08.03
Python ValueError: invalid literal for int() with base 10  (0) 2021.08.02
Python OpenCV 웹캠 실시간 읽기  (0) 2021.07.31
Comments