Python

[Python] Dictionary 초기화, setdefault()

gnoJJ 2024. 10. 3. 17:49

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를 활용하면 이렇게 코드를 간단히 할 수 있다.