상세 컨텐츠

본문 제목

[Python] 내포 활용 예시(딕셔너리, 리스트, 정렬)

python

by 진실의종아울려라 2022. 8. 7. 17:16

본문

파이썬 매일 코딩 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']

 

이렇게 코드를 작성하는게 저자가 의도한 방향인지는 모르겠지만..ㅠ 공부용으로 남겨놓으려고 한다.

관련글 더보기

댓글 영역