딕셔너리 내포문
딕셔너리 안 에서의 내포문
딕셔너리 내포문은 리스트 내포문과 비슷한 개념으로,
새로운 딕셔너리를 간결하고 효율적으로 생성하는 방법이다.
· 기본 형태
{키_표현식 : 값_표현식 for 항목 in 반복가능객체 if 조건}
- 키_표현식과 값_표현식은 새로운 리스트의 각 키와 값을 결정하는 부분이다.
- 표현식 이하의 for문은 기존의 반복기능객체를 순회하는 부분이다.
- if문은 선택적으로 사용할 수 있는데, 참인 경우에만 해당 항목을 새로운 딕셔너리에 포함시킨다.
· 동작 원리
반복가능객체의 각 요소들을 순회하여 항목에 값을 할당하고 표현식을 통해 리턴된다.
items 함수를 활용하여 반복가능객체 dic의 키와 값을 순회하고, 각 각의 항목 k, v에 이를 할당하여 표현식 k : v 로 리스트를 생성할 수 있다.
dic = {'name' : 'kim', 'age' : 30}
{k : v for k, v in dic.items()} # {'name': 'kim', 'age': 30} 출력
딕셔너리 내포문에 대해 몇 가지 예를 들어 보자.
· 각 리스트를 딕셔너리로 생성
아래의 구문은 for문의 반복가능개체로서 range(len(nums)) 를 사용하였다. 해당 함수는 nums의 리스트 길이 3을 반환하고 range 함수는 0부터 2까지의 연속된 리스트를 생성한다.
해당 리스트의 각 요소들을 순회하여 변수 i에 값을 할당하고, name[i] (키_표현식) : nums[i] (값_표현식)에 전달하여 새로운 딕셔너리를 생성한다.
names = ['Herry', 'John', 'Chris']
nums = [1, 2, 3]
dic = {names[i]:nums[i] for i in range(len(nums))}
print(dic) # {'Herry' : 1, 'John' : 2, 'Chris' : 3} 출력
위의 구문을 for문으로 나타낸 구문은 아래와 같다. 위의 내포문과 한번 비교하여 보자.
dic1 = dict()
names = ['Herry', 'John', 'Chris']
nums = [1, 2, 3]
for i in range(len(names)):
dic1[names[i]] = nums[i]
print(dic1) # {'Herry': 1, 'John': 2, 'Chris': 3} 출력
· 숫자 짝수 판별하기
nums 의 각 요소를 순회하여, 각 숫자가 짝수인지 아닌지를 딕셔너리에 저장한다.
nums = [1, 2, 3, 4, 5, 6]
dic = {i : i % 2 == 0 for i in nums}
print(dic) # {1: False, 2: True, 3: False, 4: True, 5: False, 6: True} 출력
· 문자열 길이 계산하기
words 의 각 요소를 순회하여, 각 값과 길이를 키와 벨류로 할당하여 새로운 딕셔너리를 반환한다. 이때, 각 각의 값은 키로 딕셔너리에 반영된다.
words = ['apple', 'banana', 'cherry', 'date']
{i : len(i) for i in words} # {'apple': 5, 'banana': 6, 'cherry': 6, 'date': 4} 출력
· 조건에 따른 값 변환
for문의 반복가능객체 nums를 순회하여 할당된 값을 항목 i 에 할당하고, 키_표현식 i는 이를 반환한다.
값_표현식에 쓰인 if문은 i가 짝수일 경우 'even' 문자열을, 홀수일 경우 'odd' 문자열을 반환한다.
nums = [1, 2, 3, 4, 5]
dic = {i: 'even' if i % 2 == 0 else 'odd' for i in nums}
print(dic) # {1: 'odd', 2: 'even', 3: 'odd', 4: 'even', 5: 'odd'} 출력
· 중첩된 리스트를 하나의 딕셔너리로 생성
names 객체와 nums 객체를 zip 함수를 이용해 튜플 형태로 묶어, 각 튜플의 첫 번째 인자를 k에, 두 번째 인자를 v에 할당한다. 키_표현식과 값_표현식은 이를 반환하여 하나의 딕셔너리를 생성한다.
names = ['Herry', 'John', 'Chris']
nums = [1, 2, 3]
{k : v for k, v in zip(names, nums)} # {'Herry': 1, 'John': 2, 'Chris': 3} 반환
아래의 구문은 위의 구문을 for문으로 나타낸 것이다.
여기서 주의해야 할 점이 있다.
dic[k] = v 라는 표현은 두 가지 동작을 수행한다.
- k 라는 키가 dic 딕셔너리에 존재하지 않는다면, 해당 키와 값이 각 각 k 와 v 로 딕셔너리에 추가된다.
- k 라는 키가 dic 딕셔너리에 존재한다면, 해당 키가 v 의 값으로 변경된다.
키의 값이 이미 존재하는 경우 이를 변경하지 않도록 주의하도록 하자.
names = ['Herry', 'John', 'Chris']
nums = [1, 2, 3]
dic = dict()
for k, v in zip(names, nums):
dic[k] = v
print(dic) # {'Herry': 1, 'John': 2, 'Chris': 3} 반환
딕셔너리 내포문에 대해 알아보았다.
딕셔너리 내포문은 반복가능객체를 통해 기존의 리스트와 딕셔너리를 새로운 딕셔너리로 반환하는 동작을 수행한다.
이각 리스트를 len 함수와 range 함수를 사용하여 하나의 딕셔너리로 생성하기도 하였고,
zip 함수를 이용하여 두 리스트를 하나의 튜플로 묶어, 튜플의 각 인자 값을 딕셔너리에 추가하여 생성하기도 하였다.
더불어 특정 조건을 활용하여 참인 경우, 값_표현식에 값을 할당하여 딕셔너리를 생성하였다.
(zip 함수의 경우 이전 글, 리스트 내포문에 관련 내용을 작성해 두었다.)
비슷한 듯 다른 리스트 내포문과 딕셔너리 내포문은 파이썬에서의 리스트와 딕셔너리를 간결하게 생성할 수 있으므로, 사용법을 익히는 게 좋겠다.
'[파이썬] > 내포문' 카테고리의 다른 글
[파이썬][내포문] 리스트 내포문 (0) | 2023.11.07 |
---|