초보 개발자

파이썬 모르는 것들 ( del dict['key'], dict.update, dict(dict1, ** dict2, zip) 본문

카테고리 없음

파이썬 모르는 것들 ( del dict['key'], dict.update, dict(dict1, ** dict2, zip)

taehyeki 2021. 12. 16. 19:15

DEL

ice = {'메로나': 1000,
       '폴로포': 1200,
       '빵빠레': 1800,
       '죠스바': 1200,
       '월드콘': 1500}
라는 딕셔너리가 있다고 가정하고 메로나를 지우고 싶을 때

del ice['메로나'] 이렇게 하면 지워진다.

 

UPDATE

딕셔너리를 병합하는 방법은 update하나가 있고 dict(dict1, **dict2)가 있다.

두번째 방법에서는 **를 적어주어야 한다.

 

먼저 update하는 방법은

단순히 합치려고 하는 'key' 값이 겹치지 않는다면  무난하게 병합이 되어진다.

dict1 = {'bookA': 1, 'bookB': 2, 'bookC': 3}
dict2 = {'booka': 4, 'bookb': 5, 'bookc': 6}

이러한 dict가 있다고 가정하고 두개를 합치고 싶다면 아래와 같이 해주면 된다.

dict1 = {'bookA': 1, 'bookB': 2, 'bookC': 3}
dict2 = {'booka': 4, 'bookb': 5, 'bookc': 6}

dict2.update(dict1)
dict1.update(dict2)

print(dict2)
print(dict1)
#출력값
{'booka': 4, 'bookb': 5, 'bookc': 6, 'bookA': 1, 'bookB': 2, 'bookC': 3}
{'bookA': 1, 'bookB': 2, 'bookC': 3, 'booka': 4, 'bookb': 5, 'bookc': 6}

여기서 dict2.update는 dict2가 기준이된다. 반대로 dict1.update는 dict1이 기준이 된다. 그리고 업데이트를 하면 

dict1과 dict2의 원본이 각각 바뀐다.

 

하지만 'key'값이 겹치는 경우도 있을 것이다.

dict1 = {'bookA': 1, 'bookB': 2, 'bookC': 3}
dict2 = {'bookB': 4, 'bookC': 5, 'bookD': 6}

dict2.update(dict1)

print(dict2)

#출력값
{'bookB': 2, 'bookC': 3, 'bookD': 6, 'bookA': 1}

dict2기준으로 말그대로 업데이트를 하는 것이니까 기존의 dict2가 가지고 있던 자료들을 old -> new로 업데이트 하는 것이다. 따라서 bookB와 bookC가 dict1에 있는 것과 겹치니까 dict1에있는 값으로 대체를 시킨다.

 

dict1도 마찬가지로 dict1과 dict2에서 기존에 겹치는 자료 bookB와 bookC를 dict2의 것으로 업데이트 시킬 것이므로 아래와 같은 값이 출력될 것이다.

dict1 = {'bookA': 1, 'bookB': 2, 'bookC': 3}
dict2 = {'bookB': 4, 'bookC': 5, 'bookD': 6}

dict1.update(dict2)
print(dict1)
#출력값
{'bookA': 1, 'bookB': 4, 'bookC': 5, 'bookD': 6}

 

dict.(dict1 **dict2)

그 다음 방법은 dict(dict2, **dict1)를 사용하는 것이다.

dict1 = {'bookA': 1, 'bookB': 2, 'bookC': 3}
dict2 = {'bookB': 4, 'bookC': 5, 'bookD': 6}

a =  dict(dict1, **dict2)
print(a)
#출력값
{'bookA': 1, 'bookB': 4, 'bookC': 5, 'bookD': 6}

이 경우에는 원본 값 dict1은 그대로 존재하며 return값으로 업데이트 된 값을 반환한다. 

dict2가 dict1을 덮어쓴다라고 생각하면 된다. 전의 dict1.update(dict2)와 동일

 

dict1 = {'bookA': 1, 'bookB': 2, 'bookC': 3}
dict2 = {'bookB': 4, 'bookC': 5, 'bookD': 6}

a =  dict(dict2, **dict1)
print(a)
#출력값
{'bookB': 2, 'bookC': 3, 'bookD': 6, 'bookA': 1}

반대의 경우도 이와 같다. 뒤의 **이 있는 dict2에서 dict1과 내용이 겹치면 덮어쓰는 것으로 이해하면 될 것 같다.

 

ZIP

zip() 함수는 여러 개의 순회 가능한(iterable) 객체를 인자로 받고, 각 객체가 담고 있는 원소를 튜플의 형태로 차례로 접근할 수 있는 반복자(iterator)를 반환한다.

numbers = [4, 5, 6]
letters = ["a", "b", "c"]
for pair in zip(numbers, letters):
     print(pair)

(4, 'a')
(5, 'b')
(6, 'c')

두개의 iterable객체에서 요소가 0번째 인덱스부터 순서대로 들어간 튜플로 반환한다. zip을 사용하지 않으면 아래와 같이 표현할 수도 있을 것이다. pair를 튜플로 감싸고 그 안에 인덱스 순으로 하나씩 집어 넣는다. 

numbers = [4, 5, 6]
letters = ["a", "b", "c"]
for i in range(3):
     pair = (numbers[i], letters[i])
     print(pair)

(4, 'a')
(5, 'b')
(6, 'c')

위와 같이 zip() 함수를 사용하면 마치 옷의 지퍼를 올리는 것 처럼 양 측에 있는 데이터를 하나씩 차례로 짝을 지어준다.

 

반대로 unpacking하고 싶을때가 있을 것이다. 아래와 같이 해주면 된다.

numbers = [4, 5, 6]
letters = ["a", "b", "c"]

a = zip(numbers, letters)
b, c = zip(*a)
print(b)
print(c)
 
#출력값
(4, 5, 6)
('a', 'b', 'c')

 

zip() 함수를 이용하면 두 개의 리스트나 튜플 부터 쉽게 사전(dict)을 만들 수 있다. 키를 담고 있는 리스트와 값을 담고 있는 리스트를 zip() 함수에 넘긴 후, 그 결과를 다시 dict() 함수에 넘기면 된다.

numbers = [4, 5, 6]
letters = ["a", "b", "c"]

a = dict(zip(numbers, letters))
print(a)

#출력값
{4: 'a', 5: 'b', 6: 'c'}


a = dict(zip(letters, numbers))
#출력값
{'a': 4, 'b': 5, 'c': 6}

 

주의사항이 있다. zip() 함수로 넘기는 인자의 길이가 다를 때 남는 자료는 버려진다. 가장 짧은 인자를 기준으로 데이터가 엮이기 때문이다.

numbers = ["1", "2", "3"]
letters = ["A"]
list(zip(numbers, letters))
[('1', 'A')]

#"2", "3"은 버려짐