기본 딕셔너리 구조 - Key와 Value를 한 쌍으로 갖는 자료형

{Key1:Value1, Key2:Value2, Key3:Value3, ...}

※ key는 고유한 값이여야 한다. 중복 시 나머지 무시함

※ key에는 리스트 쓸 수 없다. value에는 가능

 

딕셔너리 선언

>>> dic = {}	# 딕셔너리 선언

>>> dic[1] = 'a' # 딕셔너리 쌍 추가
>>> dic['name'] = 'pey'
>>> dic
{1: 'a', 'name': 'pey'}
>>> dic[1]		# key 사용해 value 얻기
'a'

>>> del a[1]	# 딕셔너리 삭제 del a[key값] index아님
>>> a
{2: 'b', 'name': 'pey', 3: [1, 2, 3]}

 

딕셔너리 관련 함수들

  • key 리스트 만들기 - a.keys() # dict_keys 객체 반환
  • value 리스트 만들기 - a.values() # dict_values 객체 반환
  • key, value 쌍 얻기 - a.items() # 튜플로 묶은 값을 dict_items 객체로 반환
  • key : value 쌍 모두 지우기 - a.clear()
  • key로 value 얻기 - a.get('키값')
    • a.get('name')과 a['name']과 동일한 결과값 
    • But 키가 존재하지 않을 경우, a.get('nokey')는 None을, a['nokey']는 오류 발생
  • 해당 key가 딕녀서리 안에 있는지 조사하기 - in (True, False 반환)
    • ex) 'a' in dic: ~~~

 

dict_keys 객체는 리스트 고유의 append, insert, pop, remove, sort 함수는 수행할 수 없다. 때문에 list로 변환해서 사용해야됨 -> list(a.keys())

>>> a = {'name': 'pey', 'phone': '0119993323', 'birth': '1118'}
>>> a.keys()
dict_keys(['name', 'phone', 'birth'])

>>> a.values()
dict_values(['pey', '0119993323', '1118'])

>>> a.items()
dict_items([('name', 'pey'), ('phone', '0119993323'), ('birth', '1118')])

>>> a.clear()
>>> a
{}

>>> a.get('name')
'pey'

>>> 'name' in a
True

 

딕셔너리 정렬 -> 기본. sorted를 이용한다

- key값을 이용한 정렬

>>> dict = {'A' :1,'D' :4,'C' :3,'B' :2}
>>> sdict= sorted(dict.items()) # 오름차순 정렬
[('A', 1), ('B', 2), ('C', 3), ('D', 4)]

>>>sdict= sorted(dict.items(), reverse=True) # 내림차순 정렬
[('D', 4), ('C', 3), ('B', 2), ('A', 1)]

 

- value값을 이용한 정렬 

-> items()와 lamba를 사용한다

  • 딕셔너리에 items() 메서드를 사용해주면 {"key" : value}의 형태를 [(key, value)]의 형태로 만들어 준다. -> 튜플
  • 이를 sorted해주면 key값을 기준으로 오름차순으로 정렬해준다.
  • value값으로 정렬하려면 lambda를 사용해주면 된다. ( [0]일 경우 key기준, [1]일 경우 value 기준 정렬 )
  • 내림차순 정렬 시, reverse=True
>>> dict = {'A' :1,'D' :4,'C' :3,'B' :2}
>>> sdict= sorted(dict.items(), key= lamba x : x[1])
[('A', 1), ('B', 2), ('C', 3), ('D', 4)]

 

+ itemgetter를 사용한 정렬

  • python의 내장모듈 operator를 이용한 정렬
  • key = itemgetter(기준 인덱스)
>>> from operator import itemgetter
>>> dict = {'A' :1,'D' :4,'C' :3,'B' :2}
>>> sdict= sorted(dict.items(), key= itemgetter(1))
[('A', 1), ('B', 2), ('C', 3), ('D', 4)]

 

 

+ 딕셔너리 선언, 정렬 문제 : 

2021.03.16 - [알고리즘] - 20210316_코테공부

 

20210316_코테공부

프로그래머스 - 해시 # 위장 (Level2) def solution(clothes): answer = 1 dic = {} for name, kind in clothes: if kind in dic: dic[kind] +=1 else: dic[kind] = 1 for i in dic.values(): answer *=(i+1) retu..

jungeun960.tistory.com

 

반응형

프로그래머스 - 해시

# 위장 (Level2)

def solution(clothes):
    answer = 1
    dic = {}
    for name, kind in clothes:
        if kind in dic:
            dic[kind] +=1
        else: dic[kind] = 1
    for i in dic.values():
        answer *=(i+1)

    return answer-1

 

# 베스트 앨범 (Level3)

  • Point. 딕셔너리, 딕셔너리 정렬
  1. 많이 재생된 장르 먼저 수록
  2. 장르 내에서 많이 재생된 노래 먼저 수록
  3. 장르별로 두 개씩(하나만 있으면 하나만)
def solution(genres, plays): 
    answer = [] 
    dic = {} # 장르 : (재생횟수, 고유번호)
    dic_count = {} # 장르별 재생횟수
    
    for i, (g,p) in enumerate(zip(genres, plays)):
        if g in dic:
            dic[g].append((p,i))
            dic_count[g] += p
        else:
            dic[g] = [(p,i)]
            dic_count[g] = p
    print(dic)
    print(dic_count)

    # 많이 재생된 장르순 정렬
    sorted_dic = sorted(dic_count.items(), key=lambda x: x[1], reverse=True) 
    print(sorted_dic) 
    
    for key in sorted_dic: # key값에 ('pop', 3100)
        play_list = dic[key[0]] #key[0]으로 해야 pop나옴
        print(play_list)

        # 많이 재생된 노래순 정렬
        play_list = sorted(play_list, key = lambda x : x[0], reverse=True)
        print(play_list)
        
        for i in range(len(play_list)): # 두개만 뽑아오기
            if i == 2: 
                break 
            answer.append(play_list[i][1]) 
            
    return answer

 

반응형

+ Recent posts