Python 3에서 사전 이해하기

소개

사전은 Python의 내장 매핑 유형입니다. 사전은 에 매핑하며 이러한 키-값 쌍은 Python에서 데이터를 저장하는 유용한 방법을 제공합니다.

일반적으로 ID나 사용자 프로필에 포함된 정보와 같이 관련된 데이터를 보유하는 데 사용되며, 사전은 양쪽에 중괄호 { }를 사용하여 구성됩니다.

정보: 이 자습서에서 예제 코드를 따라 하려면 python3 명령을 실행하여 로컬 시스템에서 Python 대화형 셸을 엽니다. 그런 다음 >>> 프롬프트 뒤에 예제를 추가하여 코드를 복사, 붙여넣기 또는 편집할 수 있습니다.

A dictionary looks like this:

sammy = {'username': 'sammy-shark', 'online': True, 'followers': 987}

중괄호 외에도 사전에는 콜론 (:)이 있습니다.

콜론 왼쪽의 단어는 키입니다. 는 변경할 수 없는 데이터 유형으로 구성될 수 있습니다. 위의 사전에서 키는 다음과 같습니다:

  • 'username'
  • 'online'
  • 'followers'

위의 예제에서 각 키는 문자열 값입니다.

콜론 오른쪽의 단어는 값입니다. 은 모든 데이터 유형으로 구성될 수 있습니다. 위의 사전에서 값은:

  • 'sammy-shark'
  • True
  • 987

이 값들 각각은 문자열, 부울, 또는 정수입니다.

우리는 사전 sammy를 출력해 봅시다:

print(sammy)
Output
{'username': 'sammy-shark', 'followers': 987, 'online': True}

출력을 살펴보면 키-값 쌍의 순서가 변경되었을 수 있습니다. Python 버전 3.5 이전에는 사전 데이터 유형이 정렬되지 않았습니다. 그러나 Python 버전 3.6 이후에는 사전 데이터 유형이 여전히 정렬됩니다. 사전이 정렬되어 있든지 여부에 상관없이 키-값 쌍은 유지되어 있어 관련성 있는 데이터에 액세스할 수 있습니다.

전제 조건

귀하의 컴퓨터 또는 서버에 Python 3가 설치되어 있고 프로그래밍 환경이 설정되어 있어야 합니다. 프로그래밍 환경이 설정되어 있지 않은 경우 운영 체제 (Ubuntu, CentOS, Debian 등)에 적합한 로컬 프로그래밍 환경 또는 서버의 프로그래밍 환경을 위한 설치 및 설정 가이드를 참조할 수 있습니다.

사전 요소에 액세스하기

우리는 관련된 키를 참조하여 사전의 값들을 호출할 수 있습니다.

키로 데이터 항목에 액세스하기

사전은 데이터를 저장하기 위한 키-값 쌍을 제공하기 때문에 파이썬 프로그램에서 중요한 요소가 될 수 있습니다.

만약 Sammy의 사용자 이름을 분리하려면 sammy['username']을 호출하여 수행할 수 있습니다. 출력해 봅시다:

print(sammy['username'])
Output
sammy-shark

사전은 리스트처럼 특정 인덱스 값을 얻기 위해 정수를 호출하는 대신 값에 키를 할당하고 그 키를 호출하여 관련 값을 얻을 수 있는 데이터베이스와 같이 작동합니다.

'username'을 호출함으로써 해당 키의 값인 'sammy-shark'를 받습니다.

sammy 사전의 나머지 값들도 같은 형식으로 호출할 수 있습니다:

sammy['followers']
# 987을 반환합니다

sammy['online']
# True를 반환합니다

사전의 키-값 쌍을 이용하여 키를 참조하여 값을 검색할 수 있습니다.

요소에 액세스하는 방법 사용하기

값에 액세스하는 키를 사용하는 것 외에도 일부 내장 메서드를 사용할 수 있습니다:

  • dict.keys() 키를 분리합니다
  • dict.values() 값 분리합니다
  • dict.items() 튜플 쌍의 리스트 형식의 항목을 반환합니다

키를 반환하려면 dict.keys() 메서드를 사용합니다. 예를 들어, 변수 이름을 사용하여 sammy.keys()를 사용할 것입니다. 이를 print() 메서드에 전달하여 출력을 확인해 봅시다:

print(sammy.keys())
Output
dict_keys(['followers', 'username', 'online'])

키가 dict_keys 클래스의 반복 가능한 뷰 객체 내에 배치된 출력을 받게 됩니다. 그런 다음 키가 리스트 형식으로 출력됩니다.

이 방법은 딕셔너리 간에 쿼리하는 데 사용될 수 있습니다. 예를 들어, 두 개의 딕셔너리 데이터 구조 사이에서 공통 키를 살펴볼 수 있습니다:

sammy = {'username': 'sammy-shark', 'online': True, 'followers': 987}
jesse = {'username': 'JOctopus', 'online': False, 'points': 723}

for common_key in sammy.keys() & jesse.keys():
    print(sammy[common_key], jesse[common_key])

sammy 딕셔너리와 jesse 딕셔너리는 각각 사용자 프로필 딕셔너리입니다.

그들의 프로필에는 서로 다른 키가 있습니다. Sammy는 관련된 팔로워가 있는 소셜 프로필을 갖고 있고, Jesse는 관련된 점수가 있는 게임 프로필을 갖고 있습니다. 그들이 공통으로 가지고 있는 2개의 키는 usernameonline 상태이며, 이를 실행하면 찾을 수 있습니다:

Output
sammy-shark JOctopus True False

프로그램을 개선하여 출력물을 사용자가 쉽게 읽을 수 있도록 할 수 있습니다만, 이는 dict.keys()가 여러 사전을 확인하여 공통점이나 차이점을 확인하는 데 사용될 수 있다는 것을 보여줍니다. 이는 특히 대형 사전에 유용합니다.

비슷하게, 우리는 sammy 사전의 값을 조회하기 위해 dict.values() 메서드를 사용할 수 있습니다. 이는 다음과 같이 구성됩니다: sammy.values(). 이를 출력해 봅시다:

sammy = {'username': 'sammy-shark', 'online': True, 'followers': 987}

print(sammy.values())
Output
dict_values([True, 'sammy-shark', 987])

keys()values() 메서드 모두 sammy 사전에 있는 키와 값의 정렬되지 않은 목록을 반환하며, 이는 각각 dict_keysdict_values의 뷰 객체입니다.

만약 우리가 사전에 있는 모든 항목에 관심이 있다면, items() 메서드를 사용하여 접근할 수 있습니다:

print(sammy.items())
Output
dict_items([('online', True), ('username', 'sammy-shark'), ('followers', 987)])

이의 반환 형식은 (key, value) 튜플 쌍으로 이루어진 목록이며, 이는 dict_items 뷰 객체입니다.

우리는 반환된 목록 형식을 for 루프로 반복할 수 있습니다. 예를 들어, 주어진 사전의 각 키와 값을 출력하고, 그것을 보다 읽기 쉽게 만들기 위해 문자열을 추가할 수 있습니다:

for key, value in sammy.items():
    print(key, 'is the key for the value', value)
Output
online is the key for the value True followers is the key for the value 987 username is the key for the value sammy-shark

위의 for 루프는 sammy 사전 내의 항목을 반복하고, 각 키와 값을 줄 단위로 출력하며, 이를 인간이 이해하기 쉽도록 정보를 제공합니다.

내장 메서드를 사용하여 사전 데이터 구조에서 항목, 값 및 키에 액세스할 수 있습니다.

사전 수정

사전은 변경 가능한 데이터 구조이므로 수정할 수 있습니다. 이 섹션에서는 사전 요소를 추가하고 삭제하는 방법에 대해 알아보겠습니다.

사전 요소 추가 및 변경

메서드나 함수를 사용하지 않고 다음 구문을 사용하여 사전에 키-값 쌍을 추가할 수 있습니다:

dict[key] = value

이것이 어떻게 동작하는지 실제로 살펴보기 위해 usernames라는 사전에 키-값 쌍을 추가해 보겠습니다:

usernames = {'Sammy': 'sammy-shark', 'Jamie': 'mantisshrimp54'}

usernames['Drew'] = 'squidly'

print(usernames)
Output
{'Drew': 'squidly', 'Sammy': 'sammy-shark', 'Jamie': 'mantisshrimp54'}

이제 'Drew': 'squidly' 키-값 쌍이 사전에 업데이트된 것을 볼 수 있습니다. 사전은 정렬되지 않을 수 있으므로이 쌍은 사전 출력에서 어디에나 나타날 수 있습니다. 프로그램 파일에서 나중에 usernames 사전을 사용하면 추가된 키-값 쌍이 포함됩니다.

또한 이 구문은 기존 키에 할당된 값을 수정하는 데에도 사용할 수 있습니다. 이 경우 기존 키를 참조하고 다른 값을 전달합니다.

주어진 네트워크에서 사용자 중 하나인 사전 drew를 고려해 봅시다. 이 사용자가 오늘 팔로워 수가 늘어났다고 가정하고, 'followers' 키에 전달된 정수 값을 업데이트해야 합니다. 우리는 print() 함수를 사용하여 사전이 수정되었는지 확인할 것입니다.

drew = {'username': 'squidly', 'online': True, 'followers': 305}

drew['followers'] = 342

print(drew)
Output
{'username': 'squidly', 'followers': 342, 'online': True}

결과에서 정수 값 305에서 342로 팔로워 수가 증가한 것을 볼 수 있습니다.

이 방법을 사용하여 사용자 입력으로 사전에 키-값 쌍을 추가할 수 있습니다. 사용자 이름과 연관된 사용자 이름을 추가하기 위해 명령 줄에서 실행되는 usernames.py라는 빠른 프로그램을 작성해 보겠습니다:

usernames.py
# 원래 사전 정의
usernames = {'Sammy': 'sammy-shark', 'Jamie': 'mantisshrimp54'}

# 반복할 while 루프 설정
while True:

    # 사용자에게 이름을 입력하도록 요청
    print('Enter a name:')

    # 이름 변수에 할당
    name = input()

    # 이름이 사전에 있는지 확인하고 피드백 출력
    if name in usernames:
        print(usernames[name] + ' is the username of ' + name)

    # 만약 이름이 사전에 없다면...
    else:

        # 피드백 제공        
        print('I don\'t have ' + name + '\'s username, what is it?')

        # 연관된 이름에 대한 새로운 사용자 이름 입력
        username = input()

        # 이름 키에 사용자 이름 값 할당
        usernames[name] = username

        # 데이터가 업데이트되었다는 피드백 출력
        print('Data updated.')

이제 명령 줄에서 프로그램을 실행해 보겠습니다:

  1. python usernames.py

프로그램을 실행하면 다음과 같은 출력이 나타납니다:

Output
Enter a name: Sammy sammy-shark is the username of Sammy Enter a name: Jesse I don't have Jesse's username, what is it? JOctopus Data updated. Enter a name:

프로그램 테스트를 완료하면 프로그램을 종료하기 위해 CTRL + C를 누를 수 있습니다. 코드를 개선하기 위해 프로그램을 종료하는 트리거를 설정할 수 있습니다(예: q 키를 입력).조건문을 사용하여 코드를 개선하세요.

이것은 사전을 대화형으로 수정하는 방법을 보여줍니다. 특정 프로그램에서는 CTRL + C로 프로그램을 종료하면 데이터가 모두 손실됩니다. 파일을 읽고 쓰는 방법을 구현하지 않는 한 손실됩니다.

dict.update() 메서드를 사용하여 사전을 추가하고 수정할 수도 있습니다. 이는 리스트에서 사용 가능한 append() 메서드와 다릅니다.

아래 jesse 사전에서 'followers' 키를 추가하고 정수 값으로 설정하겠습니다. 그런 다음 업데이트된 사전을 print()하겠습니다.

jesse = {'username': 'JOctopus', 'online': False, 'points': 723}

jesse.update({'followers': 481})

print(jesse)
Output
{'followers': 481, 'username': 'JOctopus', 'points': 723, 'online': False}

출력에서 우리는 'followers': 481 키-값 쌍이 사전 jesse에 성공적으로 추가된 것을 확인할 수 있습니다.

또한 특정 키에 대한 주어진 값으로 기존 키-값 쌍을 수정하는 데 dict.update() 메서드를 사용할 수 있습니다.

샘미의 온라인 상태를 True에서 False로 변경합시다. sammy 사전에서:

sammy = {'username': 'sammy-shark', 'online': True, 'followers': 987}

sammy.update({'online': False})

print(sammy)
Output
{'username': 'sammy-shark', 'followers': 987, 'online': False}

라인 sammy.update({'online': False})은 기존 키 'online'을 참조하고 그 부울 값을 True에서 False로 수정합니다. 우리가 print() 함수를 호출하여 사전을 출력하면, 업데이트가 출력에서 반영된 것을 볼 수 있습니다.

사전에 항목을 추가하거나 값을 수정하기 위해, dict[key] = value 구문 또는 dict.update() 메서드를 사용할 수 있습니다.

사전 요소 삭제

딕셔너리 데이터 유형 내에서 키-값 쌍을 추가하고 값을 변경할 수 있는 것처럼, 딕셔너리 내의 항목을 삭제할 수도 있습니다.

딕셔너리에서 키-값 쌍을 제거하려면, 다음 구문을 사용합니다:

del dict[key]

유저 중 한 명을 나타내는 jesse 사전을 살펴보겠습니다. 제시가 게임을 위한 온라인 플랫폼을 더 이상 사용하지 않는다고 가정하고, 'points' 키와 관련된 항목을 제거하겠습니다. 그런 다음, 항목이 삭제되었는지 확인하기 위해 사전을 출력하겠습니다:

jesse = {'username': 'JOctopus', 'online': False, 'points': 723, 'followers': 481}

del jesse['points']

print(jesse)
Output
{'online': False, 'username': 'JOctopus', 'followers': 481}

라인 del jesse['points']jesse 사전에서 'points': 723 키-값 쌍을 제거합니다.

만약 우리가 사전의 모든 값을 지우고 싶다면, dict.clear() 메서드를 사용할 수 있습니다. 이렇게 하면 프로그램에서 나중에 사용할 필요가 있을 때 주어진 사전을 유지하지만, 더 이상 어떠한 항목도 포함하지 않게 됩니다.

jesse 사전 내의 모든 항목을 제거해 봅시다:

jesse = {'username': 'JOctopus', 'online': False, 'points': 723, 'followers': 481}

jesse.clear()

print(jesse)
Output
{}

출력 결과에서 볼 수 있듯이, 이제 키-값 쌍이 없는 빈 사전이 되었습니다.

만약 특정 사전이 더 이상 필요하지 않다면, del을 사용하여 완전히 제거할 수 있습니다:

del jesse

print(jesse)

jesse 사전을 삭제한 후 print()을 호출하면 다음과 같은 오류가 발생합니다:

Output
... NameError: name 'jesse' is not defined

사전은 가변 데이터 유형이기 때문에 추가하거나 수정하거나 항목을 제거하고 지울 수 있습니다.

결론

이 튜토리얼은 파이썬의 사전 데이터 구조를 살펴보았습니다. 사전은 키-값 쌍으로 이루어져 있으며 인덱싱에 의존하지 않고 데이터를 저장하는 방법을 제공합니다. 이를 통해 우리는 값들을 의미에 따라 다른 데이터 유형과의 관계에 기반하여 검색할 수 있습니다.

여기서는 “데이터 유형 이해” 튜토리얼에서 다른 데이터 유형에 대해 더 배울 수 있습니다.

프로그래밍 프로젝트에서는 Scrapy를 사용한 웹 스크래핑과 같은 사전 데이터 유형을 볼 수 있습니다.

Source:
https://www.digitalocean.com/community/tutorials/understanding-dictionaries-in-python-3