본문 바로가기
파이썬

파이썬 dictionary comprehension

by python pro 2023. 1. 25.
반응형

 

Python의 딕셔너리는 키와 값으로 구성되어 있는 자료구조입니다. 딕셔너리를 사용할 때, 일반적으로 for 루프를 사용해서 값을 가져오거나 추가합니다. 하지만, Python은 딕셔너리를 더욱 효율적으로 사용할 수 있도록 "Dictionary Comprehension"을 제공합니다.

 

Dictionary Comprehension은 표현식과 for 루프를 사용하여 새로운 딕셔너리를 생성할 수 있는 구문입니다. 기본 구조는 다음과 같습니다.

{키:값 for 변수 in 순회가능한 객체}

 

예를 들어, 정수 리스트를 키로 가지고, 각 정수의 제곱을 값으로 가지는 딕셔너리를 생성하고 싶다면 다음과 같이 작성할 수 있습니다.

>>> numbers = [1, 2, 3, 4, 5]
>>> {n: n ** 2 for n in numbers}
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

 

또한, if 절을 사용하여 특정 조건을 만족하는 값만 추출할 수도 있습니다.

>>> {n: n ** 2 for n in numbers if n % 2 == 0}
{2: 4, 4: 16}

 

위 코드는 numbers 리스트에서 짝수만 키로 가지고, 그 짝수의 제곱을 값으로 가지는 딕셔너리를 생성합니다. 잘못된 코드 예시로는, 키나 값을 생성하는 표현식에서 변수를 사용하지 않는 경우가 있습니다.

>>> {n: n for n in numbers if n % 2 == 0}

위 코드는 numbers 리스트에서 짝수만 키와 값으로 가지는 딕셔너리를 생성하는 것으로, 이미 있던 값을 그대로 가져오는 것이므로 필요가 없는 코드입니다. 앞서 설명한 것처럼, Dictionary Comprehension은 효율적으로 딕셔너리를 생성하는데 유용한 기능입니다. 하지만, 코드의 가독성과 이해를 위해서는 표현식과 for 루프를 잘 사용하는 것이 중요합니다.

 

Dictionary Comprehension을 사용할 때는 주의해야 할 점이 있습니다. 키가 중복되는 경우, 나중에 추가된 키의 값으로 덮어씌워집니다. 이를 방지하기 위해서는 setdefault() 메서드를 사용하거나, if-else 절을 사용하여 이미 있는 키인지 확인하는 것이 좋습니다.

잘못된 코드 예시로는 다음과 같습니다.

>>> {n: n ** 2 for n in numbers}
>>> {n: n ** 3 for n in numbers}

위 코드는 numbers 리스트를 키로 가지고, 각 정수의 제곱, 제곱에 대한 딕셔너리를 생성하는 것으로, 키가 중복되므로 이전에 생성한 딕셔너리는 덮어씌워지게 됩니다.

 

딕셔너리 Comprehension은 효율적이고 직관적인 딕셔너리 생성에 매우 유용하지만, 키 중복에 대한 주의를 기울여야 합니다.

 

Dictionary Comprehension은 파이썬 3.x 버전부터 사용 가능합니다. 파이썬 2.x 버전에서는 사용할 수 없습니다.

 

정리하자면, Dictionary Comprehension은 키와 값으로 구성된 새로운 딕셔너리를 생성하는데 유용한 기능입니다. 표현식과 for 루프를 사용하여 코드를 간단하게 작성할 수 있으며, 키 중복에 대한 주의를 기울여야 합니다.

 

제가 설명한 것처럼 Dictionary Comprehension을 이해하고 적용해보세요. 궁금하신 점이 있다면 언제든지 질문해주세요.

아래에는 추가로 실제 업무에서도 활용될 수 있는 예제를 작성했습니다.

 

CSV 파일로부터 데이터를 읽어와서, 특정 열을 키로 가지고 그 열의 값들을 값으로 가지는 딕셔너리를 생성

import csv

def csv_to_dict(file_path, key_col, value_col):
    with open(file_path, 'r') as file:
        reader = csv.DictReader(file)
        return {row[key_col]:row[value_col] for row in reader}

data = csv_to_dict('data.csv', 'Name', 'Age')
print(data)

 

임의의 딕셔너리에서 특정 키만 가져오는 예제

original_dict = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}

keys_to_get = ['a', 'c', 'e']
new_dict = {k: original_dict[k] for k in keys_to_get if k in original_dict}
print(new_dict)

 

 

기존 딕셔너리를 이용해서 새로운 딕셔너리를 생성하는 예제

original_dict = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}

new_dict = {k: v*2 for k, v in original_dict.items()}
print(new_dict)

 

위 예제들은 단순하지만, 실제 업무에서도 이와 같은 방식으로 Dictionary Comprehension을 사용할 수 있습니다.

더 복잡한 작업을 하기 위해서는 if문과 같은 조건문을 사용하거나, 함수를 사용할 수 있습니다.

 

기존 딕셔너리에서 특정 조건을 만족하는 값만 가져오는 예제

original_dict = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}

def is_even(n):
    return n % 2 == 0

new_dict = {k: v for k, v in original_dict.items() if is_even(v)}
print(new_dict)
반응형

'파이썬' 카테고리의 다른 글

파이썬 상속, 다형성 이해하기  (0) 2023.01.26
파이썬 클래스 정의하기  (0) 2023.01.26
파이썬 list comprehension  (0) 2023.01.25
파이썬 표준 라이브러리 소개  (0) 2023.01.25
파이썬 정규표현식, 정규식  (0) 2023.01.25

댓글