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