본문 바로가기

Python_파이썬설명서/백준with파이썬

백준 1181- 단어정렬 (딕셔너리 사용법과 sorted의 lambda 람다)

딕셔너리를 정의하는 방법에는 다음과 같은 방법들이 있다.

 

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_newkey=lambda xx[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를 통해 튜플로 쌍을 붙여줘야함.