초보 개발자

13강 dict의 생성과 zip 본문

Python/윤성우 열혈 파이썬

13강 dict의 생성과 zip

taehyeki 2021. 12. 22. 15:28

[dict의 다양한 생성 방법]

 

일반적인 딕셔너리의 생성방식은 다음과 같다!!

d = {'a':1,'b':2,'c':3}
d
{'a':1,'b':2,'c':3}

 

그리고 딕셔너리는 dict라는 클라스의 객체이다

type({}) # 빈 딕셔너리 전달하면서 type함수 호출
<class 'dict'>

 

따라서 dict클래스의 객체를 직접 생성하는 형태로도 딕셔너리를 만들 수 있다.

물론 생성 방법에 차이가 있을 뿐 만들어진 결과물은 동일하다.

d = dict([('a'),1,('b',2),('c',2)]) # 또 다른 딕셔너리 생성 방법
d
{'a':1,'b':2,'c':3}

튜플들을 묶어서 리스트 안에 넣었다.

 

딕셔너리의 키가 문자열인 경우에는 다음과 같이 생성할 수도 있다.

이 경우 a,b,c는 안그럴거같지만 문자열로 인식이된다. 

d = dict(a=1,b=2,c=3) # 키가 문자열인 딕셔너리 생성방법
d
{'a':1,'b':2,'c':3}

 

또 하나 키는 키끼리 값은 값끼리 리스트에 묶어서 딕셔너리를 생성하는 방법도 있다. 단 이때는 zip이라는 함수를 사용해야 한다.

d = dict(zip(['a','b','c'],[1,2,3])) # 키와 값을 별도로 묶어서 딕셔너리 생성
d
{'a':1,'b':2,'c':3}

zip의 왼쪽에 있는 애들이 키로 사용, 오른쪽이 값으로 사용 되었다.

 

d1 = {'a':1,'b':2,'c':3}
d2 = dict([('a',1),('b',2),('c',2)])
d3 = dict(a=1,b=2,c=3)
d4 = dict(zip(['a','b','c'],[1,2,3]))
d1 == d2 == d3 == d4 # 내용 비교, 만드는 방법은 달라도 똑같은 결과물
True

딕셔너리는 원래 저장 순서를 보장하지 않는다. 사탕 통에 담긴 사탕과 비슷 어떤 사탕이 처음 들어왔을까? -> 모름

근데 파이썬 3.7버전 부터는 저장 순서를 보장하고 있다고 한다. -> 파이썬 만의 독특한 특징으로 보자

 

d = {'a':1,'b':2,'c':3}
d['d'] = 4
d
{'a':1,'b':2,'c':3,'d':4}
for k in d:
	print(d[k], end=', ')
1, ,2 ,3, 4

이렇게 순서대로 출력이 되는 것을 확인할 수 있다.

원래 딕셔너리는 보장하지 않는데 파이썬에서는 서비스차원에서 보장은 해주고 있다.

 

[zip 함수]

 

zip은 쉽게 말하면 분배하는 것과 같다.

학생 10명이 있다. 그리고 빵집에서 빵 10개와 슈퍼에서 우유 10개를 사왔다.

학생 1명에게 빵하나 우유하나를 주려고 한다. 근데 봉지에 빵 1개와 우유 1개를 담아서 그 봉지를 학생 10명에게 나눠주는 방법이 zip을 사용한 것이라고 보면 될 것 같다.

z = zip(['a','b','c'],[1,2,3]) # 두 개의 리스트에 저장된 값들을 조합
for i in z:
	print(i, end = ', ')

('a', 1), ('b', 2), ('c', 3)

zip은 첫 번째 인자로 저장된 값들, 두 번째 인자로 저장된 값들 순서대로 하나씩 뽑아서 튜플로 만든 후 어떤 저장소에 담아둔다. 그리고 그 저장소에 접근할 수 있는 iterable(iterator)를 반환한다. 

 

물론 리스트말고 튜플이 zip의 인자에 들어와도 된다. 심지어 문자열도 상관없다고 한다. 

z = zip(('a','b','c'),(1,2,3)) # 두 개의 튜플에 저장된 값들을 조합
for i in z:
	print(i, end = ', ')

('a',1), ('b', 2), ('c', 3)
z = zip("abc",(1,2,3)) # 문자열과 튜플에 저장된 값들을 조합
for i in z:
	print(i, end = ', ')

('a',1), ('b', 2), ('c', 3)

 

zip이 반환하는 객체는 for 루프에 둘 수 있다 -> 이는 iterable객체임을 나타낸다.

이를 또 list와 조합하여 사용할 수도 있다.

d = list(zip(('a','b','c'),(1,2,3))) # zip과 list의 조합
d
[('a',1),('b',2),('c',3)]

list도 되면 뭐다?? tuple도 된다.

t = tuple(zip('abc','123')) # zip과 tuple의 조합
t
(('a',1),('b',2),('c',3))

또 dict함수와도 조합할 수 있다.

d = dict(zip(['a','b','c'],(1,2,3))) # zip과 dict의 조합
d
{'a':1,'b':2,'c':3}

zip은 값들을 나누어 저장해야 할 때 유용하게 쓰일 수 있다.

 

물론 3개의 값을 나눌 수도 있다. 엄청 간단하게 할 수 있다. 인자에 문자열 튜플 리스트 뭐가오든 상관 없다

c = list(zip('abc',(1,2,3),['one','two','three]))
c
[('a',1,'one'),('b',2,'two'),('c',3,'three')]