본문 바로가기

코딩/Python

[Python/파이썬] 자료형 - Dictionary 2편 : 딕셔너리 컴프리헨션

반응형

이전 포스팅 : 2021.06.13 - [코딩/Python] - [Python/파이썬] 자료형 - Dictionary 1편

 

 

   오늘은 1편에 이어 딕셔너리 컴프리헨션 구문에 대해 정리해보려고 한다. 딕셔너리에도 리스트와 마찬가지로 컴프리헨션 구문이 존재한다. 딕셔너리 컴프리헨션을 정리하기 전에 zip 내장함수에 대해서도 공부해보았다. zip 함수를 통해 여러개의 리스트,튜플 등 자료형을 딕셔너리 key : value 형태로 만들 수 있다.

 

 

1. 내장함수 zip

 

  zip 함수는 동일한 개수로 이루어진 자료형들을 1개로 묶어 준다. zip 함수의 입력 매개변수는 iterable이어야 한다. 여기서 iterable은 반복가능한 자료형들을 말한다. 아래 예시를 통해 이해해보자.

 

 

1) 리스트 2개를 묶었을 경우

 

 

<코드>

name = ['YB', 'SW', 'EJ']
address = ['Ansan', 'Anyang', 'Seoul']

p = list(zip(name,address))

print(p)

 

<결과>

[('YB', 'Ansan'), ('SW', 'Anyang'), ('EJ', 'Seoul')]

 

 

2) 리스트 3개를 묶었을 경우

 

 

<코드>

name = ['YB', 'SW', 'EJ']
address = ['Ansan', 'Anyang', 'Seoul']
age = [25, 26, 27]

p = list(zip(name,address, age))

print(p)

  

 <결과>

[('YB', 'Ansan', 25), ('SW', 'Anyang', 26), ('EJ', 'Seoul', 27)]

 

 

3) 묶을 요소가 문자열인경우

 

 

  문자열의 경우 zip함수를 통해 각 문자가 1:1 매칭 된다.

 

 

<코드>

string1 = "ABC123"
string2 = "DEF567"

s = list(zip(string1, string2))
print(s)

 

<결과>

[('A', 'D'), ('B', 'E'), ('C', 'F'), ('1', '5'), ('2', '6'), ('3', '7')]

 

 

4) 요소의 개수가 다른 경우

 

 

  요소의 개수가 다르면 아래 처럼 개수가 많은 요소가 출력에서 제외된다.

 

 

<코드>

name = ['YB', 'SW', 'EJ']
age = [25, 27]

p = list(zip(name, age))

print(p)

 

<결과>

[('YB', 25), ('SW', 27)]

 

 

5) 딕셔너리로 생성

 

 

  위 4번까지는 list로 생성하였지만 dict( ) 함수를 통해 딕셔너리 key : value 형태로 생성 가능.

 

 

<코드>

name = ['YB', 'SW', 'EJ']
age = [25, 27, 28]

p = dict(zip(name, age))

print(p)

 

<결과>

{'YB': 25, 'SW': 27, 'EJ': 28}

 

 

 

2. 딕셔너리 컴프리헨션

 

 

리스트 컴프리헨션과 같이 딕셔너리를 생성하는 구문 중 하나이다.

 

 

 

1) 이름 리스트를 입력받아 value가 빈 딕셔너리 생성

 

 

<코드>

name = ['YB', 'SW', 'EJ']

dict1 = {r : '-' for r in name}
print(dict1)

 

<결과>

{'YB': '-', 'SW': '-', 'EJ': '-'}

 

 

2) 딕셔너리를 조건에 따라 다른 딕셔너리로 생성

 

 

<코드>

name = ['YB', 'SW', 'EJ', 'HJ']
age = [32, 31, 28, 28]

#딕셔너리 생성(name : age)
name_dic = dict(zip(name,age))

#나이가 28살인 사람만 딕셔너리로 생성하는 컴프리헨션
dict1 = {k : v for k, v in name_dic.items() if v == 28}

#이름이 YB인사람만 딕셔너리로
dict2 = {k : v for k, v in name_dic.items() if k =="YB"}

#key와 value를 서로 바꾸기
dict3 = {v : k for k, v in name_dic.items()}


 

<결과>

#원본
{'YB': 32, 'SW': 31, 'EJ': 28, 'HJ': 28}

#dic1 : 28살인 사람만
{'EJ': 28, 'HJ': 28}

#dic2 : 이름이 'YB'인 사람
{'YB': 32}

#dic3 : key, value 서로 자리 바꾸기
{32: 'YB', 31: 'SW', 28: 'HJ'}

 

 

3) zip 함수를 통해 바로 딕셔너리 생성

 

 

<코드>

name = ['YB', 'SW', 'EJ', 'HJ']
age = [32, 31, 28, 28]

#dict 생성
dict1 = {k:v for k, v in zip(name, age)}
print(dict1)

#조건1 : 나이 32살 인사람만 
dict2 = {k:v for k, v in zip(name, age) if v == 32}
print(dict2)

 

<결과>

{'YB': 32, 'SW': 31, 'EJ': 28, 'HJ': 28}
{'YB': 32}

 

 

 

 

 

 

728x90