본문 바로가기
Python

[Python] Dictionary 초기화, setdefault()

by gnoJJ 2024. 10. 3.

setdefault를 언제 쓸까?

Python에서 그래프를 Dictionary로 생성할 때에 귀찮은 점이 하나 있다.

바로 Dictionary에서 새로운 key를 만들 때는 초기화를 해주어야 한다는 점이다.


문제 코드,,

N, M = map(int,input().split())
G = {}
for _ in range(M):
    p, k = map(int,input().split())
    if p not in G:  # 조건을 만들어서 초기화하기
    	G[p] = [k]
    else:
    	G[p] += [k]
    
    if k not in G: # 양방향 그래프에선 이런 조건-초기화를 두 개 만들어야 한다.
    	G[k] = [p]
    else:
    	G[k] += [p]
print(G)

>> {1: [2, 3], 2: [1, 3, 4], 3: [1, 2, 4], 4: [2, 3, 5], 5: [4]}

이러면 없는 key에 대해서 초기화를 해주어야 한다는 불편이 생긴다.

그래서 찾아보니 setdefault() 라는 함수가 이 불편을 해결해줄 수 있었다.


setdefault 가 뭘까?

파이썬 공식 문서 중 setdefault 함수에 대한 설명, 이미지 클릭 시 문서로 이동

key가 딕셔너리에 있다면, 그것의 value(값)을 돌려줍니다. 그렇지 않으면, default를 값으로 갖는 key를 삽입하고, default(None, 또는 새로 설정하면 그 값)를 return합니다. 이때 default를 새로 설정하지 않는다면, None입니다.


Graph1 = {}
Graph1.setdefault("A")
print(Graph1)
>> {'A': None}

Graph1.setdefault("B", list())
Graph1["B"] += [21]
Graph1["B"].append(30)
print(Graph1)
>> {'A': None, 'B': [21, 30]}


G = {}
G.setdefault("a", [])
G.setdefault("a", set())
print(G)
>> {'a': []}

G = {}
G.setdefault("a", set())
G.setdefault("a", [])
print(G)
>> {'a': set()}

여기서 발견한 특징 : setdefault 함수는 초기에 설정한 데이터 타입을 새로 바꾸지 않는다.

 


직접 setdefault 구현해보기

setdefault가 dictionary의 내장 함수라서 나는 특별히 딕셔너리의 인자를 하나 더 받아야 한다.

기존에 있던 데이터를 유지 하는 특징 때문에 기존에 데이터가 존재한다면, 아무런 동작도 하지 않게 코드를 작성했다.

def setdefault2(dictionary, key, default=None):
	# key가 딕셔너리에 없는 경우에만 초기화 시켜준다. 
    if key not in dictionary:
        dictionary[key] = default
    else:
        None

Graph1 = {}
setdefault2(Graph1, "A") #"A":None
setdefault2(Graph1, "B", 10)  #"B":10
setdefault2(Graph1, "B", 20)  #적용 안 됨
setdefault2(Graph1, "C", [])  #"C":[]
setdefault2(Graph1, "C", [10])  #적용 안 됨
setdefault2(Graph1, "D", set([20,31])) #"D":{20, 31}
setdefault2(Graph1, "D", set([20,3]))  #적용 안 됨
Graph1["C"] += [30]
print(Graph1)

>> {'A': None, 'B': 10, 'C': [30], 'D': {20, 31}}

당장 간단히 구현하라면 이렇게 구현할 수 있을 듯 하다.


문제 코드에 활용하기!

N, M = map(int,input().split())
G = {}
for _ in range(M):
    p, k = map(int,input().split())
    G.setdefault(p, []).append(k)
    G.setdefault(k, []).append(p)
print(G)

>> {1: [2, 3], 2: [1, 3, 4], 3: [1, 2, 4], 4: [2, 3, 5], 5: [4]}

setdefault를 활용하면 이렇게 코드를 간단히 할 수 있다.

댓글