Original article: https://www.freecodecamp.org/news/create-a-dictionary-in-python-python-dict-methods/

이 기사에서는 Python의 딕셔너리(Dictionary) 자료형의 기본 사용법을 알아보겠습니다.

딕셔너리 생성하기, 딕셔너리 내의 요소에 접근하기, 그리고 필요에 따라 딕셔너리의 요소를 수정하는 방법에 대해 살펴보겠습니다.

또한 흔히 사용하는 딕셔너리 내장 메서드에 대해서도 설명하겠습니다.

이 기사에서 다룰 내용은 다음과 같습니다.

  1. 딕셔너리 생성 및 선언하기
    1. 빈 딕셔너리 선언하기
    2. 요소가 포함된 딕셔너리 선언하기
  2. 키(key)-값(value)란 무엇인가
    1. 딕셔너리의 키-값(key-value) 개수 확인하기
    2. 주어진 딕셔너리의 모든 키-값 보기
    3. 딕셔너리의 모든 키(key) 보기
    4. 딕셔너리의 모든 값(values) 보기
  3. 딕셔너리의 특정 키-값에 접근하기
  4. 딕셔너리 수정하기
    1.딕셔너리에 새 키-값 추가하기
    2. 딕셔너리의 기존 키-값 수정하기
    3. 키-값 삭제하기

그럼 시작해볼까요?

딕셔너리 생성 및 선언하기

Python의 딕셔너리는 키와 값으로 이루어진 자료형입니다.

다음 두 섹션을 통해 딕셔너리를 생성하는 두 가지 방법을 보여드리겠습니다.

첫 번째 방법은 중괄호 {}를 사용하는 것이고 두 번째 방법은 내장 함수 dict()를 사용하는 것입니다.

빈 딕셔너리 선언하기

빈 딕셔너리를 선언하려면 먼저 딕셔너리의 이름이 될 변수 이름을 생성합니다.

그런 다음 생성한 변수를 빈 중괄호 {}에 할당합니다.

#빈 딕셔너리 선언하기
my_dictionary = {}
print(my_dictionary)
#type() 함수를 통해 자료형을 확인하기
print(type(my_dictionary))
#출력된 결과
#{}
#<class 'dict'>

빈 딕셔너리를 생성하는 또 다른 방법은 인수를 전달하지 않고 dict() 함수를 사용하는 것입니다.

인수를 전달하지 않은 dict()는 생성자 함수 역할을 해 빈 딕셔너리를 만듭니다.

#빈 딕셔너리 선언하기
my_dictionary = dict()
print(my_dictionary)
#type() 함수를 통해 자료형을 확인하기
print(type(my_dictionary))
#출력된 결과
#{}
#<class 'dict'>

요소가 포함된 딕셔너리 선언하기

요소가 포함된 딕셔너리를 만들려면 중괄호 {}안에 키-값을 포함해야 합니다.

기본 문법은 다음과 같습니다.

dictionary_name = {키: 값}

더 자세히 설명하겠습니다.

-dictionary_name은 변수의 이름입니다. 즉, 이 예시에서는 딕셔너리의 이름입니다.

  • 할당 연산자 =키-값딕셔너리_이름에 할당합니다.
  • 중괄호 {}를 사용해 딕셔너리를 선언합니다.
  • 중괄호 안에 키-값이 있습니다. 키와 값은 쌍점 :으로 구분합니다.

예시를 통해 요소가 포함된 딕셔너리 선언하기를 확인해봅시다.

#딕셔너리 선언하기
my_information = {'name': 'Boyeon', 'age': 29, 'location': 'Seoul'}
print(my_information)
#자료형 확인하기
print(type(my_information))
#출력된 결과
#{'name': 'Boyeon', 'age': 29, 'location': 'Seoul'}
#<class 'dict'>

위 예제에서는 중괄호 내에 일련의 요소가 있습니다. 정확히 말하자면, 다음과 같은 세 개의 키-값이 있습니다: 'name': 'Boyeon', 'age': 29, and 'location': 'Seoul'.

주어진 예시의 딕셔너리에 포함된 세 키는 name, age, 그리고 location이며, 각 키에 할당된 값은 Boyeon, 29, 그리고 Seoul입니다.

딕셔너리에 여러 개의 키-값이 있을 경우 각 키-값은 쉼표로 구분합니다.

또 다른 예시를 봅시다.

이번에는 dict() 함수를 사용해 요소가 포함된 딕셔너리를 생성해야 한다고 가정해보겠습니다.

방법은 간단합니다. dict()를 사용해 일련의 키-값을 함수에 대한 인수로 전달하면 됩니다.

#dict() 함수를 사용해 딕셔너리 생성하기
my_information = dict({'name': 'Boyeon', 'age': 29, 'location': 'Seoul'})
print(my_information)
#자료형 확인하기
print(type(my_information))
#출력된 결과
#{'name': 'Boyeon', 'age': 29, 'location': 'Seoul'}
#<class 'dict'>

딕셔너리를 만드는 또 다른 방법은 바로 fromkeys() 메서드를 사용하는 것입니다.

미리 정의된 일련의 요소를 인수로 전달 받고 일련의 요소를 딕셔너리의 지정된 키로 사용해 새 딕셔너리를 반환합니다.

사용자가 선택 사항으로 모든 키에 대한 값을 설정할 수 있지만, 설정하지 않는다면 기본적으로 키의 값은 None이 됩니다.

fromkeys() 메서드의 기본 문법은 다음과 같습니다.

딕셔너리_이름 = dict.fromkeys(sequence,value)

모든 키에 값을 설정하지 않고 fromkeys()를 사용해 딕셔너리를 만드는 예를 살펴봅시다.

#일련의 문자열 생성하기
cities = ('Paris','Athens', 'Madrid')
#fromkeys() 메서드를 사용해 `my_dictionary`라는 딕셔너리 생성하기
my_dictionary = dict.fromkeys(cities)
print(my_dictionary)
#{'Paris': None, 'Athens': None, 'Madrid': None}

이제 딕셔너리의 모든 키에 동일한 값을 설정하는 다른 예를 보여드리겠습니다.

#일련의 문자열 생성하기
cities = ('Paris','Athens', 'Madrid')
#단일 값을 생성하기
continent = 'Europe'
my_dictionary = dict.fromkeys(cities,continent)
print(my_dictionary)
#출력된 결과
#{'Paris': 'Europe', 'Athens': 'Europe', 'Madrid': 'Europe'}

키(key)-값(value)란 무엇인가

Python 딕셔너리 내의 키는 수정 불가능한(immutable) 타입일 수도 있습니다.

Python에서 수정 불가능한 데이터 타입은 정수(integers), 문자열(strings), 튜플(tuples), 실수형(floating point numbers), 그리고 불린 자료형(Booleans)입니다.

딕셔너리의 키는 집합 자료형(sets), 리스트(lists), 또는 딕셔너리(dictionaries)와 같은 수정 가능한(mutable) 데이터 타입일 수 없습니다.

다음과 같은 딕셔너리가 있다고 가정해보겠습니다.

my_dictionary = {True: "True",  1: 1,  1.1: 1.1, "one": 1, "languages": ["Python"]}
print(my_dictionary)
#출력된 결과
#{True: 1, 1.1: 1.1, 'one': 1, 'languages': ['Python']}

위의 예시에 있는 딕셔너리의 키는 불린, 정수, 실수형, 그리고 자료형 데이터 타입으로 모두 키로 사용 가능합니다.

수정 가능한 데이터 타입의 키를 생성하려고 하면 TypeError 오류가 발생합니다.

my_dictionary = {["Python"]: "languages"}
print(my_dictionary)
#출력된 결과
#line 1, in <module>
#    my_dictionary = {["Python"]: "languages"}
#TypeError: unhashable type: 'list'

위에 예에서 수정 가능한 데이터 타입인 리스트를 키로 지정하려고 했기 때문에 TypeError: unhashable type: 'list' 오류가 발생했다는 것을 확인할 수 있습니다.

반면, 딕셔너리 내의 값(value)에는 데이터 타입에 관한 제한이 없습니다. 즉, 수정 가능한 데이터와 수정 불가능한 데이터 타입을 값으로 사용할 수 있습니다.

주목해야 할 키와 값의 또 다른 차이점은 키는 고유하다는 점입니다. 다시 말해 한 딕셔너리에 같은 이름의 키는 한 개 이상 존재할 수 없습니다. 하지만 딕셔너리 내에 동일한 값은 중복될 수 있습니다.

(더 명확한 설명을 위해 예시를 들어보겠습니다 --옮긴이)

#이렇게 딕셔너리에 `name` 키가 두 번 있을 수 없습니다
my_dictionary = {'name': 'Boyeon', 'name': 'Ihn'}
#하지만 딕셔너리에 `Seoul`이라는 값은 중복될 수 있습니다
my_information = {'birthplace': 'Seoul', 'current_location': 'Seoul'}

딕셔너리의 키-값(key-value) 개수 확인하기

len() 함수는 인수로 전달된 객체의 총 길이를 반환합니다.

딕셔너리가 len() 함수에 인수로 전달되면, 딕셔너리에 포함된 키-값의 총 개수를 반환합니다.

len()을 사용해 키-값의 수를 계산하는 방법은 다음과 같습니다.

my_information = {'name': 'Dionysia', 'age': 28, 'location': 'Athens'}
print(len(my_information))
#출력된 결과
#3

주어진 딕셔너리의 모든 키-값 보기

딕셔너리에 있는 모든 키-값을 보려면 items() 내장 함수를 사용합니다.

year_of_creation = {'Python': 1993, 'JavaScript': 1995, 'HTML': 1993}
print(year_of_creation.items())
#출력된 결과
#dict_items([('Python', 1993), ('JavaScript', 1995), ('HTML', 1993)])

items() 메서드는 딕셔너리의 키-값을 포함하는 튜플 목록을 반환합니다.

딕셔너리의 모든 키(key) 보기

딕셔너리에 있는 모든 키를 확인하려면 keys() 내장 메서드를 사용합니다.

year_of_creation = {'Python': 1993, 'JavaScript': 1995, 'HTML': 1993}
print(year_of_creation.keys())
#출력된 결과
#dict_keys(['Python', 'JavaScript', 'HTML'])

keys() 메서드는 딕셔너리에 있는 키만 포함하는 리스트를 반환합니다.

딕셔너리의 모든 값(values) 보기

딕셔너리에 있는 모든 값을 확인하려면 values() 내장 메서드를 사용합니다.

year_of_creation = {'Python': 1993, 'JavaScript': 1995, 'HTML': 1993}
print(year_of_creation.values())
#출력된 결과
#dict_values([1993, 1995, 1993])

values() 메서드는 딕셔너리에 있는 값만 포함하는 리스트를 반환합니다.

딕셔너리의 특정 키-값에 접근하기

Python에서는 기존 리스트 내의 특정 요소를 접근해야 할 때, 일반적으로 리스트 이름과 대괄호 표기법을 사용합니다. 대괄호 안에는 리스트 항목의 인덱스 번호를 지정합니다. 이렇게요.

(명확한 설명을 위해 예시를 추가합니다 --옮긴이)

#기존 리스트
my_list = [1993, 1995, 2022]
#대괄호와 인덱스 번호를 사용해 첫 번째 요소 접근하기
first_element = my_list[0]
print(first_element)
#출력된 결과
# 1993

딕셔너리에서는 리스트와 완전히 동일한 방법을 사용할 수 없습니다.딕셔너리는 키-값으로 이루어진 데이터 타입이기 때문에 인덱스 번호를 사용해 딕셔너리 내의 요소를 접근할 수 없기 때문입니다.

딕셔너리의 이름과 대괄호 표기법을 사용해 특정 요소에 접근한다는 점은 리스트와 비슷하지만, 딕셔너리는 이 대괄호 안에 접근하고 싶은 키를 지정합니다.

각 키는 특정 값에 해당하므로 접근하고 싶은 값과 지정된 키를 참조합니다.

특정 키-값에 접근하는 기본 문법은 다음과 같습니다.

dictionary_name[key]

Python 딕셔너리에서 특정 요소에 액세스하는 방법을 예시를 통해 살펴봅시다.

my_information = {'name': 'Dionysia', 'age': 28, 'location': 'Athens'}
#'age' 키에 할당된 값 접근하기
print(my_information['age'])
#출력된 결과
#28

주어진 딕셔너리에 존재하지 않는 키에 접근하려고 하면 어떻게 될까요?

my_information = {'name': 'Dionysia', 'age': 28, 'location': 'Athens'}
#존재하지 않는 'job' 키에 할당된 값 접근하기
print(my_information['job'])
#출력된 결과
#line 4, in <module>
#    print(my_information['job'])
#KeyError: 'job'

딕셔너리에 그런 키는 존재하지 않기 때문에 KeyError 오류가 발생합니다.

이와 같은 오류를 방지하는 한 가지 방법은 먼저 딕셔너리에 그 특정 키가 있는지 확인하는 것입니다.

바로 불린 값을 반환하는 in 키워드를 사용하면 됩니다. 키가 딕셔너리에 있으면 True를, 딕셔러니에 없으면 False를 반환합니다.

my_information = {'name': 'Dionysia', 'age': 28, 'location': 'Athens'}
#search for the 'job' key
print('job' in my_information)
#출력된 결과
#False

KeyError 오류를 방지하려면 get() 메서드를 사용해 딕셔너리의 항목에 접근하는 방법도 있습니다.

찾으려는 키를 인수로 전달하면 get() 함수는 전달된 키에 해당하는 값을 반환합니다.

my_information = {'name': 'Dionysia', 'age': 28, 'location': 'Athens'}
#get() 메서드를 통해 'job' 키에 접근하기
print(my_information.get('job'))
#출력된 결과
#None

예시에 보인 것처럼, 존재하지 않는 키를 접근하려고 하면 get() 메서드는 기본적으로 KeyError 오류 대신 None을 반환합니다.

get() 함수에 인수로 전달된 키가 딕셔너리에 없을 때 None이라는 메시지 대신 다른 메시지가 반환되도록 get() 함수를 사용자 정의할 수 있습니다.

키가 없을 때 표시되고 싶은 메시지를 get() 메서드의 두 번째 옵션 인수로 전달하면 됩니다.

my_information = {'name': 'Boyeon', 'age': 29, 'location': 'Seoul'}
#get() 메서드를 통해 'job' 키에 접근하기
print(my_information.get('job', '이 값은 존재하지 않습니다'))
#출력된 결과
#이 값은 존재하지 않습니다

이제 딕셔너리에 없는 키를 접근하려고 하면 이 값은 존재하지 않습니다라는 메시지가 콘솔에 출력됩니다.

딕셔너리 수정하기

딕셔너리는 "mutable," 즉, 수정 가능한 데이터 타입이기 때문에 내용을 변경할 수 있습니다.

프로그램이 실행되는 동안에도 딕셔너리는 규모가 커질 수도, 축소할 수도 있고, 새 항목이 추가되거나, 기존 항목이 새 값으로 수정되거나, 삭제될 수도 있습니다.

딕셔너리에 새 키-값 추가하기

딕셔너리에 키-값 쌍을 추가하려면 대괄호 표기법을 사용합니다.

새 키-값을 추가하는 기본 문법은 다음과 같습니다.

dictionary_name[key] = value

먼저 새 키-값을 추가하고 싶은 딕셔너리의 이름을 지정합니다. 그런 다음 대괄호 안에 추가하고 싶은 키의 이름을 넣고, 키에 값을 할당합니다.

빈 딕셔너리로 시작한다고 가정해봅시다.

my_dictionary = {}
print(my_dictionary)
#출력된 결과
#{}

이제 my_dictionary 딕셔너리에 키-값을 추가해보겠습니다.

my_dictionary = {}
#빈 딕셔너리에 키-값 추가하기
my_dictionary['name'] = "Boyeon Ihn"
#딕셔너리 출력하기
print(my_list)
#출력된 결과
#{'name': 'Boyeon Ihn'}

다른 새 키-값을 추가하려면 대괄호 표기법을 동일하게 사용하면 됩니다.

my_dictionary = {}
#빈 딕셔너리에 키-값 추가하기
my_dictionary['name'] = "Boyeon Ihn"
#키-값 또 추가하기
my_dictionary['age'] = 29
#딕셔너리 출력하기
print(my_dictionary)
#출력된 결과
#{'name': 'Boyeon Ihn', 'age': 29}

추가하려는 키가 해당 사전에 이미 있고 다른 값을 할당하는 경우, 기존에 있는 키의 값만 업데이트될 뿐, 새 키-값이 추가되지 않습니다.

키는 고유해야 한다는 점, 꼭 명심하시길 바랍니다.

my_dictionary = {'name': 'Boyeon Ihn', 'age': 29}
print(my_dictionary)
#'age' 키를 새로 생성하고 값을 할당하려고 시도해봅니다
#하지만 'age' 키는 이미 딕셔너리에 존재한 상황입니다.
my_dictionary['age'] = 46
#이런 경우, 존재하고 있는 'age'의 값이 29에서 46로 업데이트 될 뿐, 새 키-값이 추가되지 않습니다
print(my_dictionary)
#출력된 결과
#{'name': 'Boyeon Ihn', 'age': 29}
#{'name': 'Boyeon Ihn', 'age': 46}

실수로 이미 존재하는 키에 할당된 값을 변경하지 않으려면, 추가하려는 키가 딕셔너리에 이미 있는지 확인하는 게 좋습니다.

이전 섹션에 설명한대로 in 키워드를 이때 유용하게 사용할 수 있습니다.

my_dictionary = {'name': 'Boyeon Ihn', 'age': 29}
#'age' 키를 추가하려고 합니다. 추가하기 전에, 'age' 키가 이미 있는지 확인해봅시다.
print('age' in my_dictionary)
#출력된 결과
#True

딕셔너리의 기존 키-값 수정하기

딕셔너리의 키-값 요소를 업데이트 및 수정하는 방법은 딕셔너리에 키-값을 새로 추가하는 방법과 유사합니다.

기존 키의 값을 수정하는 경우 이전 섹션에서 본 것처럼 다음과 같은 기본 문법을 사용합니다.

dictionary_name[existing_key] = new_value
my_dictionary = {'name': 'Boyeon Ihn', 'age': 29}
my_dictionary['age'] = 46
print(my_dictionary)
#출력된 결과
#{'name': 'Boyeon Ihn', 'age': 29}

딕셔너리의 내용을 수정하려면 update() 내장 메서드를 사용해도 됩니다.

이 메서드는 딕셔너리에서 두 개 이상의 키-값을 동시에 업데이트하려는 경우 특히 유용합니다.

my_dictionary에서 nameage 키의 값을 수정하고 새 키 occupation을 추가한다고 가정합시다.

my_dictionary = {'name': 'Boyeon Ihn', 'age': 29}
my_dictionary.update(name= 'Mike Green', age = 46, occupation = "software developer")
print(my_dictionary)
#출력된 결과
#{'name': 'Mike Green', 'age': 46, 'occupation': 'software developer'}

update() 메서드는 키-값의 튜플을 인수로 전달 받습니다.

딕셔너리에 이미 존재하는 키는 새 값이 할당되었고, 새 키-값이 추가되었습니다.

update() 메서드는 한 딕셔너리의 내용을 다른 딕셔너리에 추가하려는 경우에도 유용합니다.

numbers 딕셔너리가 있고, more_numbers라는 또 다른 딕셔너리가 있다고 가정해봅시다.

more_numbers내의 내용물을 numbers와 병합하려면 update() 메서드를 사용해야 합니다.

more_numbers에 포함된 모든 키-값은 numbers 딕셔너리의 끝에 추가됩니다.

numbers = {'one': 1, 'two': 2, 'three': 3}
more_numbers = {'four': 4, 'five': 5, 'six': 6}
#'numbers' 딕셔너리 업데이트하기
#`more_numbers' 딕셔너리의 요소들을 기존 딕셔너리에 추가합니다
numbers.update(more_numbers)
print(numbers)
#출력된 결과
#{'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5, 'six': 6}

딕셔너리의 키-값 삭제하기

딕셔너리에서 특정 키 및 관련 값을 삭제하는 방법 중 하나는 del 키워드를 사용하는 것입니다.

키-값을 삭제하는 기본 문법은 다음과 같습니다.

del dictionary_name[key]

다음 예시를 통해 my_information dictionary 딕셔너리에서 location 키를 삭제해보겠습니다.

my_information = {'name': 'Boyeon', 'age': 29, 'location': 'Seoul'}
del my_information['location']
print(my_information)
#출력된 결과
#{'name': 'Boyeon', 'age': 29}

del 키워드를 사용하면 키와 값 둘 다 삭제된다는 것을 확인하셨나요? 키를 삭제하고 같이 제거되는 값을 따로 저장하려면 pop() 내장 메서드를 사용합니다.

pop() 메서드는 지정한 키를 제거하지만 할당된 값을 반환합니다. 나중에 사용하거나 접근할 수 있도록 제거된 값을 변수에 저장할 수 있습니다.

pop() 메서드를 사용하는 기본 문법은 다음과 같습니다. 함수에 삭제하려는 키를 인수로 전달해야 한다는 것을 확인할 수 있습니다.

dictionary_name.pop(key)

위 예시처럼 location 키를 삭제를 하지만, 동시에 키에 할당된 값은 따로 저장하고 싶다면 다음과 같이 pop() 메서드를 사용하면 됩니다.

my_information = {'name': 'Boyeon', 'age': 29, 'location': 'Seoul'}
city = my_information.pop('location')
print(my_information)
print(city)
#출력된 결과
#{'name': 'Boyeon', 'age': 29}
#Seoul

pop() 메서드에 딕셔너리에 존재하지 않는 키를 인수로 전달한다면, KeyError 오류 메시지가 나타납니다.

my_information = {'name': 'Boyeon', 'age': 29, 'location': 'Seoul'}
my_information.pop('occupation')
print(my_information)
#출력된 결과
#line 3, in <module>
#   my_information.pop('occupation')
#KeyError: 'occupation'

KeyError 오류를 방지하는 방법은 pop() 메서드에 두 번째 인수를 전달하는 것입니다.

두 번째 인수를 전달하면 위의 오류는 발생하지 않습니다. 대신, 첫 번째 인수로 전달된 키가 딕셔너리에 존재하지 않으면 pop()는 silent fail(조용한 에러)만 발생할 뿐 딕셔너리 자체는 바뀌지 않습니다.

my_information = {'name': 'Boyeon', 'age': 29, 'location': 'Seoul'}
my_information.pop('occupation','Not found')
print(my_information)
#출력된 결과
#{'name': 'Boyeon', 'age': 29, 'location': 'Seoul'}

pop() 메서드는 특정 키와 관련 값을 제거합니다. 하지만 딕셔너리의 마지막 키-값만 삭제하려면 어떻게 해야 할까요?

이런 경우 내장 메서드인 popitem()을 사용하세요.

다음 코드가 popitem()의 기본 문법입니다.

dictionary_name.popitem()

popitem() 메서드는 인수를 사용하지 않고 딕셔너리의 마지막 키-값이 제거된 딕셔너리를 반환합니다.

my_information = {'name': 'Boyeon', 'age': 29, 'location': 'Seoul'}
popped_item = my_information.popitem()
print(my_information)
print(popped_item)
#출력된 결과
#{'name': 'Boyeon', 'age': 29}
#('location', 'Seoul')

마지막으로, 딕셔너리에 포함된 모든 키-값을 삭제하려면 clear() 내장 메서드를 사용할 수 있습니다.

my_information = {'name': 'Boyeon', 'age': 29, 'location': 'Seoul'}
my_information.clear()
print(my_information)
#출력된 결과
#{}

이 메서드를 사용하면 기존 딕셔너리가 비어지는 것을 확인할 수 있습니다.

마치며

이렇게 딕셔너리 자료형과 자주 사용하는 메서드에 대해 배워봤습니다. 긴 글을 읽느라 수고하셨습니다!

이 기사가 도움이 되었길 바랍니다.

Python에 대해 더 배워보고 싶다면 freeCodeCamp의 Python 수료증 과정을 확인해보세요. 수료증 강의를 통해 초보자여도 Python을 재미있고 유익하게 배우면서 5개의 프로젝트를 해보며 배운 것을 열심히 실습할 수 있을 거에요.

읽어주셔서 감사합니다. Happy coding!