파이썬 매일 코딩 e-book을 구매해서 공부 중에 다양한 자료구조, 정렬, 내포를 활용하는 문제가 있어서 풀이 방법을 정리하려고 한다. 책 자체에 별도 해설은 없는 것 같은..?
Q) 부모(parent) - 자식(child) 간 관계 및 나이가 아래와 같을 때, 나이 순으로 자식 이름을 리스트로 출력하는 함수 만들기
[ 리스트 내포(list comprehension) 활용 ]
# A의 자식: B(20살) / C(10살) / D(30살)
# E의 자식: F(5살) / G(15살)
diagram = {
'A' : [{'B':20}, {'C':10}, {'D':30}],
'E' : [{'F':5}, {'G':15}]
}
내가 푼 방법은 아래와 같은데, 처리 순서를 3개로 구분해보면
① 이름과 나이를 요소로 가지는 리스트 만들기
original_list = [ [name,age]
for values in diagram.values()
for sub_dict in values
for name,age in sub_dict.items() ]
# [['B', 20], ['C', 10], ['D', 30], ['F', 5], ['G', 15]]
- values는 diagram(딕셔너리)의 values로 리스트 이고,
- sub_dict는 values(리스트)의 각 요소로 딕셔너리 이고,
- name, age는 sub_dict의 key(키),value(값)이다.
② 나이 순으로 정렬된 리스트 만들기
sorted_list = sorted( original_list, key = lambda x : x[1] )
# [['F', 5], ['C', 10], ['G', 15], ['B', 20], ['D', 30]]
- sorted 라는 함수를 사용하면, 정렬된 리스트를 얻을 수 있는데, key = lambda 를 활용해서 정렬 순서를 지정해줄 수 있다.
- original_list의 각 요소는 [ name, age ] 형태로 x[0]: name // x[1]: age라고 보면 된다.
- 그렇기 때문에 key = lambda x : x[1] 은 age 순서로 오름차순 정렬한다는 의미이다.
※ 내림차순 정렬하려면, sorted 내부에 reverse = True 를 추가 하면 된다.
③ 정렬된 리스트에서 이름만 뽑아내기
final_list = [ fin_name[0] for fin_name in sorted_list ]
# ['F', 'C', 'G', 'B', 'D']
▶ 내포만 활용하여 함수를 만들고 리스트 출력
diagram = {
'A' : [{'B':20}, {'C':10}, {'D':30}],
'E' : [{'F':5}, {'G':15}]
}
def dict_age_compare(diagram):
return [ fin_name[0]
for fin_name in sorted( [ [name,age]
for values in diagram.values()
for sub_dict in values
for name,age in sub_dict.items() ], key = lambda x : x[1] ) ]
print(dict_age_compare(diagram))
# ['F', 'C', 'G', 'B', 'D']
이렇게 코드를 작성하는게 저자가 의도한 방향인지는 모르겠지만..ㅠ 공부용으로 남겨놓으려고 한다.
[python] Chrome Webdriver 업데이트 없이 selenium(셀레니움) 실행하는 방법 (1) | 2024.04.28 |
---|---|
[python] OCR 기능 활용, 이미지에서 한글 텍스트 읽어오기 (with 네이버 클로바 OCR) (0) | 2024.04.13 |
[Python] 리스트 평탄화 - 내포 활용 (0) | 2022.08.07 |
[Python] 리스트 내포 if / else 구문 사용 방법 (0) | 2022.08.06 |
[python] datetime (0) | 2022.06.02 |
댓글 영역