딕셔너리를 정의하는 방법에는 다음과 같은 방법들이 있다.
dict_ex1과 같이 정석적인 방법,
dict_ex2와 dict_ex3와 같이 한쌍의 키와 벨류로 이루어진 튜플을 구성하여 dict으로 바꾸는 방법.
백준을 좀 하다보니 이제와서야 딕셔너리가 문제 풀이에 효과적임을 깨닫고 있다;;
다음은 딕셔너리를 이용해 1181번을 해결한 코드이다.
# 백준 1181(내거)
import sys
N=int(input())
li=[]
for _ in range(N):
li.append(sys.stdin.readline().rstrip())
li=list(set(li))
li_dic=sorted(li)
leng=len(li)
li_new={li_dic[i]:len(li_dic[i])*leng+i for i in range(leng)}
li_new=li_new.items()
li_new=sorted(li_new, key=lambda x: x[1]) #Note: No matter what iterable, it always returns a list.
#dic_item이 sorted에 들어가도 sorted함수에서는 쌍으로 튜플되어있는 "리스트"로 자료를 정리해서 해석하므로
#람다에 저렇게 쓰면 li_new[i][1]했을때 안되지만 sorted안의 람다에서는 callable해짐.
for i in range(len(li)):print(li_new[i][0]);
여기서 본인은
li_new={li_dic[i]:len(li_dic[i])*leng+i for i in range(leng)}
를 통해 딕셔너리를 만들었다. 이와 같이 포문을 {}안에 넣어서 딕셔너리 생성을 간편하게 할 수 있다.
그런데 딕셔너리.items()를 쓰게 되면 아래와 같이 dic_items 라는게 반환되는데 이게 기존의 리스트도 아니고 뭣도 아닌거 같고 그래서 좀 당황스럽다.
이를 리스트로 변환하면 우리가 직관적으로 이용하고 사용하기 더 편한 형태가 다음과 같이 나온다.
그리고 위의 코드에서 웹서치를 해서 딕셔너리에서 key가 아닌 value 기준으로 sorted를 하고 싶어서
li_new=sorted(li_new, key=lambda x: x[1])
이와 같이 코드를 썼는데 당췌 x[1]이 어캐 먹혀드는건지 몰랐던거다; 왜냐면 위와 같이 li_new가 dict_items가 된 형태에선 li_new[여기는 람다의 이터러블 도는부분인듯][1] 이렇게 작성해도 에러가 뜨고 값이 반환되지 않는데 sorted의 lambda안에서는 잘 동작하니 어찌된 일인지; 했는데
sorted를 거치면 무슨 이터러블 자료형을 넣든 list로 나오기 때문에 dictionary 가 위와 같이 list()한 튜플의 형태로 안에서 해석되기 때문에 li_new[0][1]는 not callable해도 sorted(dict, key=lambda x=x[1])는 callable한 것.
참고로 또 헷갈릴 수 있는게 item()없이 list화 하면 아래와 같이 key만 뱉음
아래와 같이 items를 통해 튜플로 쌍을 붙여줘야함.
'Python_파이썬설명서 > 백준with파이썬' 카테고리의 다른 글
백준 11729풀이와 해설 - 하노이탑 쌓기 (0) | 2021.06.27 |
---|---|
python에서 ctrl+6 (^)처럼 제곱 표현하기 (0) | 2021.06.24 |
Python 중괄호와 소괄호의 차이 (0) | 2021.06.24 |