[Python] Why, How - operator.itemgetter()

하쮸·2025년 10월 2일

Error, Why, What, How

목록 보기
40/62

1. 콜백함수, 람다를 이용.

books = [  {"제목" : "혼자 공부하는 파이썬"
         ,  "가격" : 18000}, 
           {"제목" : "혼자 공부하는 머신러닝 + 딥러닝"
         ,  "가격" : 26000} , 
           {"제목" : "혼자 공부하는 자바스크립트"
         ,  "가격" : 24000}
        ]

# 콜백함수 : 함수의 인자(argument)에 사용하는 함수.
def 가격추출함수(book):
    return book["가격"]

print("가장 저렴한 책")
# key 매개변수를 통해 비교 기준을 지정.
print(min(books, key=lambda book : book["가격"])))
print()
print("가장 비싼 책")
print(max(books, key=가격추출함수))
-- 실행결과 --

가장 저렴한 책
{'제목': '혼자 공부하는 파이썬', '가격': 18000}

가장 비싼 책
{'제목': '혼자 공부하는 머신러닝 + 딥러닝', '가격': 26000}
  • 해당 코드의 문제점.
    • 콜백 함수.
      • 콜백 함수(가격추출함수)가 무엇인지 파악하기 위해서 함수를 찾아봐야됨.
    • 람다.
      • 람다는 어려운 문법.
      • 람다라는 문법을 잘 모를 경우 코드 읽기가 다소 어려울 수도 있음.

2. operator.itemgetter()

  • operator 모듈의 itemgetter()함수는 특정 요소를 추출하는 함수를 만드는 함수.
    • operator.itemgetter()를 이용하면
      • 별도의 함수 정의나 람다 없이, key로 추출할 항목만 지정하면 됨.
      • 코드가 간결하고 직관적이며 읽는 사람도 바로 어떤 값을 기준으로 비교하는지 알 수 있음.

2-1. 공식 문서.

docs.python.org/3/library/operator

operator.itemgetter(item)
operator.itemgetter(*items)
  • 피연산자의 __getitem__() 메서드를 사용해서 지정된 항목(item)을 가져옴.
    • 만약 여러 개의 item이 지정되면 각각을 조회한 값들을 묶은 튜플을 반환.
  • item은 피연산자의 __getitem__()이 허용하는 어떤 타입이든 가능.
    • 딕셔너리(dict)는 해시 가능한 값(key)이면 가능.
    • 리스트, 튜플, 문자열은 인덱스나 슬라이스를 허용.
def itemgetter(*items):
    if len(items) == 1:
        item = items[0]
        def g(obj):
            return obj[item]
    else:
        def g(obj):
            return tuple(obj[item] for item in items)
    return g
  • 인자가 하나일 때.
    • 내부 함수 g는 객체(obj)에서 하나의 항목만(obj[item]) 반환하도록 만들어짐.
# 'itemgetter(2)'는 'lambda obj: obj[2]'와 서로 같은 함수.

itemgetter(2) == lambda obj: obj[2]
  • 인자가 여러 개일 때.
    • 내부 함수 g는 객체(obj)에서 지정된 모든 항목을 가져와 튜플로 묶어 반환.
# 'itemgetter(2, 5, 3)'는 'lambda obj: (obj[2], obj[5], obj[3])'와 같은 함수.

itemgetter(2, 5, 3) == lambda obj: (obj[2], obj[5], obj[3])

2-1-1. 간단한 Ex.

itemgetter(1)('ABCDEFG')

# 실행결과 : 'B'
itemgetter(1, 3, 5)('ABCDEFG')

# 실행결과 : ('B', 'D', 'F')
itemgetter(slice(2, None))('ABCDEFG')

# 실행결과 : 'CDEFG'
soldier = dict(rank='captain', name='dotterbart')
itemgetter('rank')(soldier)

# 실행결과 : 'captain'
inventory = [('apple', 3), ('banana', 2), ('pear', 5), ('orange', 1)]
getcount = itemgetter(1)


list(map(getcount, inventory))
# 실행결과 : [3, 2, 5, 1]

sorted(inventory, key=getcount)
# 실행결과 : [('orange', 1), ('banana', 2), ('apple', 3), ('pear', 5)]

2-2. Ex1.

# operator 모듈의 itemgetter() 함수를 가져옴.
from operator import itemgetter

books = [  {"제목" : "혼자 공부하는 파이썬"
         ,  "가격" : 18000}, 
           {"제목" : "혼자 공부하는 머신러닝 + 딥러닝"
         ,  "가격" : 26000} , 
           {"제목" : "혼자 공부하는 자바스크립트"
         ,  "가격" : 24000}
        ]


print("가장 저렴한 책")
# key 매개변수를 통해 비교 기준을 지정.
print(min(books, key = itemgetter('가격')))
print()
print("가장 비싼 책")
print(max(books, key = itemgetter('가격')))
-- 실행결과 --

가장 저렴한 책
{'제목': '혼자 공부하는 파이썬', '가격': 18000}

가장 비싼 책
{'제목': '혼자 공부하는 머신러닝 + 딥러닝', '가격': 26000}
  • 이전 코드와 동일한 결과를 보여주고 훨씬 읽기 편해졌음.

2-3. Ex2.

# operator 모듈의 itemgetter() 함수를 가져옴.
from operator import itemgetter

data = [ ("가나다", 3), ("abc", 1), ("123", 2) ]

# 두 번째 요소(숫자)를 기준으로 정렬.
sorted_data = sorted(data, key=itemgetter(1))
print(sorted_data)
-- 실행결과 --

[('abc', 1), ('123', 2), ('가나다', 3)]
profile
Every cloud has a silver lining.

0개의 댓글