Basic | 특정 데이터 가져오기 (operator.itemgetter)
itemgetter()는 특정 인덱스, key 값을 가진 데이터를 반환
from operator import itemgetter
python의 operator 모듈의 함수 중 하나, operator.itemgetter()
Return a callable object that fetches item from its operand using the operand’s getitem() method.
말이 어렵게 써있지만,
- list, tuple, dictionary 등의 데이터에서 특정 항목을 가져온다.
sorted()
,map()
에서 활용 가능하도록 호출 가능한 형태를 반환
예시: sorted
학생들의 시험점수를 나타낸 리스트가 있고,
exam = [
("Alice", 80),
("Jane", 95),
("Peter", 72)
]
시험 점수가 높은 학생 순으로 정렬하고 싶다면, sorted()에 들어갈 key 함수에 점수 기준으로 정렬하도록 설정해야 한다.
# 1. 리스트의 각 원소(학생)의 시험점수를 반환하는 함수를 만들고
def get_score(student):
# (이름, 점수) 형식의 튜플
return student[1]
# 2. def_score 함수를 key로 넘겨주어 exam 데이터 속의 점수를 기준으로 정렬할 수 있도록 한다.
sorted_students = sorted(exam, key=get_score, reverse=True)
이때 itemgetter()
를 사용한다면 get_socre
함수를 만들지 않고, 특정 원소를 바로 반환받을 수 있다.
# itemgetter(1): 1번째 원소를 반환
sorted_students = sorted(exam, key=itemgetter(1), reverse=True)
작동 원리
itemgetter(1)("ABCDEFG")
### >>> 'B'
itemgetter(0, 2)("ABCDEFG") # 여러 개의 값이 선택되면 tuple 형태로 반환
### >>> ('A', 'C')
f = itemgetter(2)
라면 f(r)
호출 후 r[2]
반환하는 형태와 같다.
itemgetter()의 구현은 다음과 같다. 근데 알 필요가 없죠
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
활용: map
map 함수는 iterable한 모든 항목에 지정한 funciton을 적용한 후 그 결과를 반환 (정확히는 결과를 내는 iterator를 반환한다, 반환형도 list가 아니라 map object)
inventory = [('apple', 5), ('banana', 10), ('orange', 2), ('kiwi', 1)]
# map: inventory라는 리스트에 itemgetter(0) 함수를 동일하게 적용
# itemgetter: inventory라는 리스트에서 0번째 item을 가져옴
list(map(itemgetter(0), inventory))
### >>> ['apple', 'banana', 'orange', 'kiwi']
활용: dictionary key
itemgetter()
의 매개변수로 dictionary 자료형의 key 값을 넣어줄 수 있다.
students = [
{'name': 'Alice', 'age': 19, 'score': 80},
{'name': 'Jane', 'age': 17, 'score': 95},
{'name': 'Peter', 'age': 16, 'score': 72},
]
sorted(students, key=itemgetter('age'))
### >>> [{'name': 'Peter', 'age': 16, 'score': 72},
### {'name': 'Jane', 'age': 17, 'score': 95},
### {'name': 'Alice', 'age': 19, 'score': 80}]
Reference
- https://docs.python.org/3/library/operator.html#operator.lt
- https://wikidocs.net/109327