본문 바로가기
파이썬/리스트, 딕셔너리

defaultdict: list를 다뤄보자

by 인공지능 초년생 2022. 2. 27.

프로그래머스의 '위장'이라는 문제를 풀다가 딕셔너리가 리스트로 할 수 있다는 사실을 배웠다.

코딩테스트 연습 - 위장 | 프로그래머스 (programmers.co.kr)

 

코딩테스트 연습 - 위장

 

programmers.co.kr

clothes = [["yellowhat", "headgear"], ["bluesunglasses", "eyewear"], ["green_turban", "headgear"]]

clothes의 상황을 보면 clothes는 2차원 리스트인데 

clothes의 행마다 2가지 정보로 나열 되어있다.  하나는 옷 이름이며, 다른 하나는 카테고리이다. 

 

우리는 카테고리: 카테고리에 해당하는 옷들 이런식으로 정렬하고 싶다.

{headgear' : ['yellowhat', 'green_turban'], 'eyewear' : ['bluesunglasses']}

 

이런 식으로 정렬하고 싶은데가능할까?

정답은 가능하다!

from collections import defaultdict

clothes_dic= defaultdict(list)

for i in range(len(clothes)):
    clothes_dic[clothes[i][-1]] += [clothes[i][0]]

딕셔너리를 생성할때 list라고 지정하면 이 딕셔너리의 value는 리스트가 된다!

clothes[i][1]은 딕셔너리의 키로 만들고 clothes[i][0]은 value취급하면 된다. 

clothes_dic[clothes[i][1]]은 리스트 연산이 가능하게 된다. 거대한 딕셔너리안에 리스트를 만들었다고 보면 된다.

 

clothes_dic[clothes[i][-1]] += [clothes[i][0]]

 

clothes[i][-1]에 해당하는 리스트에 clothes[i][0]을 append한다고 생각하면 된다. 

value에다가 []를 씌운다음, +를 하여 붙였다. 

리스트끼리는 덧셈이 가능하기에 가능한 일이다. 

잘 정렬이 되었다.

 

key에는 옷의 종류가 나와있다. 
values에는 key의 리스트 안에 들어있는 원소들이 나온다. 

옷의 종류가 key가 key가 만든 리스트에 속하는 원소들이 values()라고 생각하면 된다. 

이때 옷의 종류는 2가지라서 2행이 된다. 2차원 리스트가 나온다. 

[ [headgear이라는 key에 속한 집합],

  [eyewear이라는 key에 속한 집합] ]

 

for 문을 이용하여 리스트를 순차적으로 꺼내보았다.

2차원 리스트에서 하나씩 나오는 것을 알 수 있다. 

 

외전)

from collections import defaultdict

clothes_dic= defaultdict(str)

for i in range(len(clothes)):
    clothes_dic[clothes[i][-1]] += clothes[i][0]

만약 딕셔너리를 list가 아닌 str로 설정한다음 +를 하면 어떻게 될까?

보면 알겠지만 str의 연산대로 작용하여, yellowhat과 green_turban이 붙어서 나오는 대참사를 맛볼 수 있다.

 

 

 

 

 

'파이썬 > 리스트, 딕셔너리' 카테고리의 다른 글

defaultdict에 대하여  (0) 2022.02.23
빈 리스트 확인 법  (0) 2022.02.13
리스트 슬라이싱  (0) 2022.02.12
리스트의 시작  (0) 2022.02.12