IT/언어

[python] 사전형의 리스트(list내의 dict)에서 키, 값 검색하기;get 메소드, filter 함수, 내포 표기

개발자 두더지 2022. 9. 5. 23:11
728x90

일본의 한 블로그 글을 번역한 포스트입니다. 오역 및 의역, 직역이 있을 수 있으며 틀린 내용은 지적해주시면 감사하겠습니다. 

 

 python의 사전 리스트의 요소를 검색하는 방법에 대해 다루고자 한다. 여기서 얘기하는 사전 리스트는 아래와 같이 하나의 리스트에, 사전형 데이터가 여러 개 들어있는 형태를 의미한다.

list_person = [
    { 'name':'Taro', 'height':170, 'weight':60 },
    { 'name':'Jiro', 'height':180, 'weight':80 },
    { 'name':'Hanako', 'height':160, 'weight':50 }
]

 

 

사전 리스트에서 키를 검색하여, 값의 목록을 획득하기


1. 일반적인 지정법

 사전의 키를 직접 지정하여 값의 목록을 얻을 수 있는 방법에 대해 설명하겠다.

 아래의 코드는 내포 표기로 사전형의 요소를 순서대로 꺼내서, 키를 지정하여 값을 얻어내는 방식이다.

### 사전의 리스트로 부터 키를 검색하여 값의 목록을 획득(키를 직접 지정하는 방법)
list_person = [
    { 'name':'Taro', 'height':170, 'weight':60 },
    { 'name':'Jiro', 'height':180, 'weight':80 },
    { 'name':'Hanako', 'height':160, 'weight':50 }
]

l_name = [ d['name'] for d in list_person]
print(l_name)
# ['Taro', 'Jiro', 'Hanako']

l_height = [ d['height'] for d in list_person]
print(l_height)
# [170, 180, 160]

l_weight = [ d['weight'] for d in list_person]
print(l_weight)
# [60, 80, 50]

l_age = [ d['age'] for d in list_person]
print(l_age)
# KeyError: 'age'

 여기서 리스트 내포 표기로 기재한  l_name = [ d['name'] for d in list_person] 에 대해서 간단히 설명하자면, list_person에서 사전형 요소를 1개씩 꺼내어 d에 전달한다. d['name']으로 키가 'name'에 대응하는 값을 추출해 새로운 리스트를 생성한다. 

 참고로 위에서 볼 수 있듯 키를 직접하는 방법의 경우, 키가 존재하지 않은 경우 에러가 된다.

 

2. get 메소드를 이용하여 키를 지정하는 방법 

 앞서 살펴 본 예에서는 키가 존재하지 않는 경우 에러가 나는 것에 대해서 살펴봤다. 이러한 문제를 해결할 수 있는 방법이 바로 get 메소드를 사용하는 것이다.

 사전의 값을 검색할 때에 사전의 get 메소드를 사용하면 키가 존재하지 않은 경우도 에러가 발생하지 않고, 지정한 디폴트값이 반환된다. 또한, 디폴트값은 생략 가능하므로, 생략한 경우는 None이 반환된다.

 기본 사용법은 다음과 같다.

사전형데이터.get(키, 디폴트값)

 아래의 코드는 사전의 값을 검색할 때 get 메소드를 사용하는 예시이다.

### 사전의 리스트에서 키를 검색해 값의 목록을 획득[get 메소드]
list_person = [
    { 'name':'Taro', 'height':170, 'weight':60 },
    { 'name':'Jiro', 'height':180, 'weight':80 },
    { 'name':'Hanako', 'height':160, 'weight':50 }
]

l_name = [ d.get('name') for d in list_person]
print(l_name)
# ['Taro', 'Jiro', 'Hanako']

l_height = [ d.get('height') for d in list_person]
print(l_height)
# [170, 180, 160]

l_weight = [ d.get('weight') for d in list_person]
print(l_weight)
# [60, 80, 50]

l_age = [ d.get('age') for d in list_person]
print(l_age)
# [None, None, None]

 존재하지 않는 "age"를 지정해도 에러가 발생하지 않고 None이 반환된다.

 

 

사전 리시트에서 키를 검색하고 대응하는 사전 요소를 획득하기


 다음으로 사전 리스트에서 키를 검색하고 대응하는 사전의 요소를 획득하는 방법에 대해서 소개하도록 하겠다.

 

1. filter 함수를 사용하는 방법

 filter 함수와 lambda식을 이용해 키를 검색하여 대응하는 사전의 요소를 획득하는 방법에 대해 알아보자. 

 filter 함수에는 제 1 인수에 함수, 제 2 인수에는 이터러블 오브젝트를 지정한다. filter 함수를 이용하는 것으로 이터러블 오브젝트(리스트, 튜플 등)에서 함수가 "True"가 되는 요소를 추출할 수 있다. filter 함수의 사용법은 다음과 같다.

filter(함수, 이터러블오브젝트)

 아래는 filter 함수와 lambda 식으로 검색할 키와 값을 지정해 대응하는 사전 요소를 획득하는 샘플코드이다.

### 사전 리스트에서 키를 검색하여 대응하는 사전을 획득
list_person = [
    { 'name':'Taro', 'height':170, 'weight':60 },
    { 'name':'Jiro', 'height':180, 'weight':80 },
    { 'name':'Hanako', 'height':160, 'weight':50 }
]

print(filter(lambda item : item['name'] == 'Taro', list_person))
# <filter object at 0x0000017C04C5F390>

print(list(filter(lambda item : item['name'] == 'Taro', list_person)))
# [{'name': 'Taro', 'height': 170, 'weight': 60}]

 filter(lambda item : item['name'] == 'Taro', list_person)의 부분을 살펴보면, filter 함수의 함수로 lambda 식을 지정하고 이터러블 오브젝트로써 list_person를 지정한다. 

 list_person 요소가 있는 사전 중, 키 "name" 의 값이 "Taro"인 경우에 lambda 식으로 기재된 함수가 True가 된다. 또한, filter 함수의 반환값이 filter 오브젝트로 그대로 확인할 수 없기 때문에 list함수로 리스트로 변환하여 표시하였다.

 아래의 코드는 참고용이지만, 사전에서 다시 키를 지정해여 값을 꺼내는 샘플 코드이다.

list_person = [
    { 'name':'Taro', 'height':170, 'weight':60 },
    { 'name':'Jiro', 'height':180, 'weight':80 },
    { 'name':'Hanako', 'height':160, 'weight':50 }
]

list_search = list(filter(lambda item : item['name'] == 'Taro', list_person))
dict_search = list_search[0]
print(dict_search['height'])
# 170
print(dict_search['weight'])
# 60

 

2. 내포표기의 [if+조건식]을 사용하는 방법

 내포표기로 "if+조건문"을 이용하여, 키를 검색하여 대응하는 사전 요소를 획득할 수 있다. 내포 표기에 "if+조건식"을 부여하는 것으로 조건식을 만족하는 경우의 요소만 있는 새로운 리스트가 생성된다.

list_person = [
    { 'name':'Taro', 'height':170, 'weight':60 },
    { 'name':'Jiro', 'height':180, 'weight':80 },
    { 'name':'Hanako', 'height':160, 'weight':50 }
]

list_search = [ item for item in list_person if item['name'] == 'Taro' ]
print(list_search)
# [{'name': 'Taro', 'height': 170, 'weight': 60}]

 

 list_search = [ item for item in list_person if item['name'] == 'Taro' ] 를 살펴보면, list_person의 요소인 사전을 1개씩 꺼내, item에 전달한다. 'if+조건식"으로 키 "name" 값이 "Taro"인 사전 요소를 찾을 수 있게 되어 있다.


참고자료

https://python-academia.com/dict-list-search/

728x90