74. 파이썬 표준 라이브러리 operator.itemgetter operator.attrgetter

  • 네이버 블로그 공유하기
  • 카카오톡 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 트위터 공유하기

지난 포스팅에서는 functools.reduce() 를 사용해서 리스트 요소의 누적값과 최대값, 최소값을 구하는 코드를 알아봤습니다.
이번 포스팅에서는 operator.itemgetter 에 대해 공부해 보도록 하겠습니다.

파이썬 표준 라이브러리

operator.itemgetter

operator.itemgetter 라이브러리는 보통 sorted 같은 함수의 key 매개변수에 적용하여 여러가지 기준으로 정렬을 할 수 있게 도와 주는 모듈입니다.

튜플 정렬

아래 처럼 학생들의 이름과 나이, 성적 같은 정보를 저장한 students 리스트가 있다고 가정해 보겠습니다.

Python
#  students_list.py
students = [
    ("mickle", 25, 'A'),
    ("david", 22, 'C'),
    ("jone", 31, 'C'),
]

students 리스트에는 3개의 튜플이 있고 각 튜플은 이름, 나이, 성적에 해당하는 알파벳 의 순서대로 데이터가 만들어져 있습니다.
이 리스트를 나이 순으로 어떻게 정렬하면 좋을까요?
이 질문은 아래 코드 처럼 sorted() 함수의 key 매개변수에 itemgetter() 를 적용해서 해결을 할 수 가 있습니다.

Python
#  students_tuple.py
from operator import itemgetter

students = [
    ("mickle", 25, 'A'),
    ("david", 22, 'C'),
    ("jone", 31, 'C'),
]

result = sorted(students, key=itemgetter(1))
print(result)

위 코드를 실행을 해보면 아래 처럼 나이 순서대로 정렬이 되어 출력 된 것을 볼 수 있습니다.

Python
(py_study_31010) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>python students_tuple.py
[('david', 22, 'C'), ('mickle', 25, 'A'), ('jone', 31, 'C')]

위 코드에서 itemgetter(1) 은 students 의 아이템인 튜플의 2 번째 요소를 기준으로 정렬을 하겠다는 의미입니다.
만약에 itemgetter(2) 로 사용을 한다면 성적 순 으로 정렬을 하게 됩니다.
1 번째 요소는 이름이고, 2 번째 요소는 나이, 3 번째 요소는 성적을 의미하는 알파벳인 것입니다.

딕셔너리 정렬

그럼 이번에는 위의 students 요소가 리스트 가 아닌 딕셔너리 형태로 있다고 해보겠습니다.

Python
#  students_dict.py
from operator import itemgetter

students = [
    {"name": "mickle", "age": 25, "grade": 'A'},
    {"name": "david", "age": 22, "grade": 'C'},
    {"name": "jone", "age": 31, "grade": 'C'}
]

result = sorted(students, key=itemgetter('age'))
print(result)

위 코드처럼 딕셔너리 형태로 students 의 요소들이 있고 age 를 기준으로 정렬을 시켜 봤습니다.
결과는 아래와 같습니다.

Python
(py_study_31010) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>python students_dict.py
[{'name': 'david', 'age': 22, 'grade': 'C'}, {'name': 'mickle', 'age': 25, 'grade': 'A'}, {'name': 'jone', 'age': 31, 'grade': 'C'}]

위 처럼 나이 순서 대로 잘 정렬이 된 것을 확인 할 수 있습니다.

operator.attrgetter

operator.attrgetter 은 students 리스트 의 요소가 튜플이 아니라 Student 클래스의 객체라고 할 때 사용할 수 있습니다.

Python
#  students_class.py
from operator import attrgetter

class Student:
    def __init__(self, name, age, grade):
        self.name = name
        self.age = age
        self.grade = grade

students = [
    Student('mickle', 25, 'A'),
    Student('david', 22, 'C'),
    Student('jone', 31, 'C'),
]

result = sorted(students, key=attrgetter('age'))
print(result)

위의 코드는 attrgetter(‘age’) 가 Student 클래스의 객체인 age 속성으로 정렬을 하겠다는 의미입니다.
이전에 진행했던 것 처럼 attrgetter(‘grade’) 로 사용을 한다면 성적 순으로 정렬을 한다는 의미입니다.
위 코드를 실행시키면 아래와 같이 나옵니다

Python
(py_study_31010) D:\Dropbox\02.My_Job\80.Study\01.Python\00.study_python_3.11.0\01.TEST>python students_class.py
[<__main__.Student object at 0x000001EF1913B1C0>, <__main__.Student object at 0x000001EF1913B100>, <__main__.Student object at 0x000001EF1913B280>]
>>>

위 처럼 나오는 것은 리스트에 객체의 문자열 표현(representation)이 출력된 것입니다.

각각의 요소는 main.Student object at 0x0000015E409CCC70과 같은 형태로 표시되는데, 이는 해당 객체가 main.Student 클래스의 인스턴스임을 나타냅니다. 0x0000015E409CCC70과 같은 값은 객체가 메모리에서 할당된 주소를 나타냅니다.

이 결과는 클래스의 repr 메서드가 구현되지 않았거나 기본적인 형태로 구현되었기 때문에 발생하는 것입니다. repr 메서드를 클래스에 추가하면 객체의 문자열 표현을 원하는 형태로 커스터마이즈할 수 있습니다.

  • 이 포스팅은 ‘위키독스’ 의 ‘점프 투 파이썬‘ 전자책을 구매하여 독학하기 위한 자료로 작성했습니다.
74. 파이썬 표준 라이브러리 operator.itemgetter operator.attrgetter

Leave a Comment