프로그래머스의 '위장'이라는 문제를 풀다가 딕셔너리가 리스트로 할 수 있다는 사실을 배웠다.
코딩테스트 연습 - 위장 | 프로그래머스 (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가 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 |