[Python] List에 저장되어 있는 Object의 특정 항목으로 소팅하기 Develop Tip

버클리 DB의 Key, Data 에서 Key의 대소 비교를 위해서는,
key의 compare 함수를 지정해야 합니다. 
이런 식으로 사용자 지정 compare 함수를 지정함으로써 
Key를 임의의 구조체로 생각해도 되지요.

유사하게 파이썬에서도 특정 객체로 구성되어 있는 목록(어레이)에서
특정 항목으로 정렬을 하고자 할 때, 다음과 같이 하면 됩니다.

그러면 첫번째 결과는 이름으로 소팅되도록 되어 있고,
두번째는 val 정수 값으로 정렬됩니다.

결과는,


key는 어느 값으로 정렬할 것인가 하는 키를 return 하는 것이고,
cmp 함수가 또 있는데 이는 a, b 두개의 아이텀을 받아 해당 값을 빼주면 됩니다.

참고로 cmp 는 파이썬 3.x 에서는 더이상 지원되지 않는다고 하니 key를 애용하시면 될 듯 합니다.


class MyCls:
    def __init__(self, name, val):
        self.name = name
        self.val = val
    def __repr__(self):
        return 'MyCls(name="%s",val=%s)' % (self.name, self.val)
    @staticmethod
    def keyfunc1(c):
        return c.name
    @staticmethod
    def keyfunc2(c):
        return c.val

mc_arr = [
    MyCls('ccc', 27),
    MyCls('aaa', 33),
    MyCls('bbb', 15),
    MyCls('ddd', 7),
]

mc_arr.sort(key=MyCls.keyfunc1)
print mc_arr

arr2 = sorted(mc_arr, key=MyCls.keyfunc2) # does not change input array
print arr2


어느분께는 도움이 되셨기를 바랍니다...

핑백

  • 지훈현서 : [Python] 목록의 필터링 적용 2013-04-16 10:02:49 #

    ... 니다. y = filter(lambda e: e is not None and len(e) > 0, y) 지난번 람다함수관련 내용과,목록 관련 내용인 목록과 셑, 목록 소팅 및 목록 초기화 등과 더불어많이 사용하고픈 내용입니다. 어느분께는 도움이 되셨기를... ... more

덧글

댓글 입력 영역

구글애드텍스트