Python의 사전

2024. 1. 3. 18:09python/basic

사전과 목록은 다음과 같은 특징을 공유합니다.

  • 둘 다 변경 가능합니다.
  • 둘 다 역동적입니다. 필요에 따라 늘리거나 줄일 수 있습니다.
  • 둘 다 중첩될 수 있습니다. 목록에는 다른 목록이 포함될 수 있습니다. 사전에는 다른 사전이 포함될 수 있습니다. 사전에는 목록이 포함될 수도 있고 그 반대도 가능합니다.

사전은 주로 요소에 액세스하는 방법이 목록과 다릅니다.

  1. 목록 요소는 인덱싱을 통해 목록에서의 위치에 따라 액세스됩니다.
  2. 사전 요소는 키를 통해 액세스됩니다.

사전 정의

사전은 키-값 쌍의 모음으로 구성됩니다. 각 키-값 쌍은 키를 관련 값에 매핑합니다. 쉼표로 구분된 키-값 쌍 목록을 중괄호({})로 묶어 사전을 정의할 수 있습니다. 콜론(:)은 각 키를 관련 값과 구분합니다.

d = { <key>: <value>, <key>: <value>, . . . <key>: <value> }

다음은 해당 메이저 리그 야구 팀의 이름에 위치를 매핑하는 사전을 정의합니다.

In [ ]:
MLB_team = {
    'Colorado' : 'Rockies',
    'Boston'   : 'Red Sox',
    'Minnesota': 'Twins',
    'Milwaukee': 'Brewers',
    'Seattle'  : 'Mariners'
}

내장된 dict() 함수를 사용하여 사전을 구성할 수도 있습니다. dict()에 대한 인수는 일련의 키-값 쌍이어야 합니다. 튜플 목록은 다음과 같은 경우에 적합합니다.

d = dict([ (<key>, <value>), (<key>, <value), . . . (<key>, <value>) ])

MLB_team그런 다음 다음과 같이 정의할 수도 있습니다.

In [ ]:
MLB_team = dict([
    ('Colorado', 'Rockies'),
    ('Boston', 'Red Sox'),
    ('Minnesota', 'Twins'),
    ('Milwaukee', 'Brewers'),
    ('Seattle', 'Mariners')
])

키 값이 단순 문자열인 경우 키워드 인수로 지정할 수 있습니다. 따라서 MLB_team:을 정의하는 또 다른 방법이 있습니다.

In [ ]:
MLB_team = dict(
    Colorado='Rockies',
    Boston='Red Sox',
    Minnesota='Twins',
    Milwaukee='Brewers',
    Seattle='Mariners'
)

사전을 정의한 후에는 목록에서와 마찬가지로 해당 내용을 표시할 수 있습니다. 위에 표시된 세 가지 정의는 모두 표시되면 다음과 같이 나타납니다.

In [ ]:
type(MLB_team)
In [ ]:
MLB_team

사전의 항목은 정의된 순서대로 표시됩니다. 사전 요소는 숫자 인덱스로 액세스되지 않습니다.

In [ ]:
MLB_team[1]

사전 값에 액세스

값은 대괄호 안에 해당 키를 지정하여 사전에서 검색됩니다([]).

In [ ]:
MLB_team['Minnesota']

기존 사전에 항목을 추가하는 것은 단순히 새 키와 값을 할당하는 문제입니다.

In [ ]:
MLB_team['Kansas City'] = 'Royals'
>>> MLB_team

항목을 업데이트하려면 기존 키에 새 값을 할당하면 됩니다.

In [ ]:
MLB_team['Seattle'] = 'Seahawks'
MLB_team

항목을 삭제하려면 del 문을 사용하여 삭제할 키를 지정하세요.

In [ ]:
del MLB_team['Seattle']
MLB_team

사전 키와 목록 인덱스

In [ ]:
d = {0: 'a', 1: 'b', 2: 'c', 3: 'd'}
d
In [ ]:
d[0]
In [ ]:
d = {3: 'd', 2: 'c', 1: 'b', 0: 'a'}
d
In [ ]:
d[0]

점진적으로 사전 구축

In [ ]:
person = {}
type(person)
In [ ]:
person['fname'] = 'Joe'
person['lname'] = 'Fonebone'
person['age'] = 51
person['spouse'] = 'Edna'
person['children'] = ['Ralph', 'Betty', 'Joey']
person['pets'] = {'dog': 'Fido', 'cat': 'Sox'}

person

하위 목록이나 하위 사전의 값을 검색하려면 추가 인덱스나 키가 필요합니다.

In [ ]:
person['children'][-1]
In [ ]:
person['pets']['cat']

사전에 포함된 값은 동일한 유형일 필요가 없습니다. person에서 일부 값은 문자열이고, 하나는 정수, 하나는 목록, 하나는 다른 사전입니다.
사전의 값이 동일한 유형일 필요가 없는 것처럼 키도 동일한 유형일 필요가 없습니다.

사전 키에 대한 제한 사항

Python에서는 거의 모든 유형의 값을 사전 키로 사용할 수 있습니다. 정수, 부동 소수점 및 부울 객체가 키로 사용되는 다음 예를 보았습니다.

In [ ]:
foo = {42: 'aaa', 2.78: 'bbb', True: 'ccc'}
foo

유형이나 함수와 같은 내장 객체를 사용할 수도 있습니다.

In [ ]:
d = {int: 1, float: 2, bool: 3}
d
In [ ]:
d = {bin: 1, hex: 2, oct: 3}
d[oct]

그러나 사전 키가 준수해야 하는 몇 가지 제한 사항이 있습니다.

첫째, 주어진 키는 사전에 한 번만 나타날 수 있습니다. 중복 키는 허용되지 않습니다. 사전은 각 키를 해당 값에 매핑하므로 특정 키를 두 번 이상 매핑하는 것은 의미가 없습니다.

위에서 이미 존재하는 사전 키에 값을 할당하면 키가 두 번 추가되지 않고 기존 값이 대체된다는 것을 확인했습니다.

In [ ]:
MLB_team = {
    'Colorado' : 'Rockies',
    'Boston'   : 'Red Sox',
    'Minnesota': 'Twins',
    'Milwaukee': 'Brewers',
    'Seattle'  : 'Mariners'
}

MLB_team['Minnesota'] = 'Timberwolves'
MLB_team

마찬가지로 사전을 처음 생성하는 동안 키를 두 번째로 지정하면 두 번째 발생이 첫 번째 발생을 재정의합니다.

MLB_team = { 'Colorado' : 'Rockies', 'Boston' : 'Red Sox', 'Minnesota': 'Timberwolves', 'Milwaukee': 'Brewers', 'Seattle' : 'Mariners', 'Minnesota': 'Twins' } MLB_team

둘째, 사전 키는 변경할 수 없는 유형이어야 합니다. 정수, 부동 소수점, 문자열, 부울 등 친숙한 몇 가지 불변 유형이 사전 키로 사용되는 예를 이미 보았습니다.

튜플은 불변이기 때문에 튜플은 사전 키가 될 수도 있습니다.

In [ ]:
d = {(1, 1): 'a', (1, 2): 'b', (2, 1): 'c', (2, 2): 'd'}
d[(1,1)]

그러나 목록이나 다른 사전은 사전 키 역할을 할 수 없습니다. 왜냐하면 목록과 사전은 변경 가능이기 때문입니다.

사전 값에 대한 제한 사항

대조적으로, 사전 값에는 제한이 없습니다. 사전 값은 목록 및 사전과 같은 변경 가능한 유형과 다음 튜토리얼에서 배우게 될 사용자 정의 객체를 포함하여 Python이 지원하는 모든 유형의 객체일 수 있습니다.

또한 사전에 여러 번 나타나는 특정 값에 대한 제한도 없습니다.

In [ ]:
d = {0: 'a', 1: 'a', 2: 'a', 3: 'a'}
d
In [ ]:
d[0] == d[1] == d[2]

연산자 및 내장 함수

예를 들어 in 및 not in 연산자는 True 또는 False를 반환합니다.

In [ ]:
MLB_team = {
    'Colorado' : 'Rockies',
    'Boston'   : 'Red Sox',
    'Minnesota': 'Twins',
    'Milwaukee': 'Brewers',
    'Seattle'  : 'Mariners'
}

'Milwaukee' in MLB_team

사전에 없는 키에 액세스하려고 할 때 오류 발생을 방지하기 위해 in 연산자를 단락 평가와 함께 사용할 수 있습니다.

'Toronto' in MLB_team and MLB_team['Toronto']

단락 평가로 인해 MLB_team['Toronto'] 표현식이 평가되지 않으므로 KeyError 예외가 발생하지 않습니다.

len() 함수는 사전에 있는 키-값 쌍의 수를 반환합니다.

In [ ]:
MLB_team = {
    'Colorado' : 'Rockies',
    'Boston'   : 'Red Sox',
    'Minnesota': 'Twins',
    'Milwaukee': 'Brewers',
    'Seattle'  : 'Mariners'
}
len(MLB_team)

내장된 사전 메소드

d.clear() : 사전을 지웁니다.

In [ ]:
d = {'a': 10, 'b': 20, 'c': 30}

d.clear()
d

d.get([, ]) : 사전에 키가 있는 경우, 키 값을 반환합니다.

In [ ]:
d = {'a': 10, 'b': 20, 'c': 30}

print(d.get('b'))
In [ ]:
print(d.get('z'))

<key>을 찾을 수 없고 선택적 <default> 인수가 지정된 경우 None 대신 해당 값이 반환됩니다.

In [ ]:
print(d.get('z', -1))

d.items() : 사전의 키-값 쌍 목록을 반환합니다.

In [ ]:
list(d.items())
In [ ]:
list(d.items())[1][1]

d.keys() : 사전의 키 목록을 반환합니다.

In [ ]:
list(d.keys())

d.values() : 사전의 값 목록을 반환합니다.

In [ ]:
list(d.values())

d의 중복 값은 발생한 횟수만큼 반환됩니다.

In [ ]:
d = {'a': 10, 'b': 10, 'c': 10}

list(d.values())

d.pop([, ]) : 사전에 키가 있으면 제거하고 해당 값을 반환합니다.

In [ ]:
d = {'a': 10, 'b': 20, 'c': 30}

d.pop('b')
In [ ]:
d

<key>가 d에 없으면, d.pop(<key>)는 KeyError 예외가 발생합니다.

In [ ]:
d.pop('z')

<key>가 d에 없고 선택적 <default> 인수가 지정된 경우 해당 값이 반환됩니다.

In [ ]:
d.pop('z', -1)

d.popitem() : 사전에서 키-값 쌍을 제거합니다.

In [ ]:
d = {'a': 10, 'b': 20, 'c': 30}

d.popitem()
In [ ]:
d
In [ ]:
d.popitem()
In [ ]:
d

d가 비어 있으면 d.popitem()은 KeyError 예외를 발생합니다.

In [ ]:
d = {}
d.popitem()

d.update() : 사전을 다른 사전이나 반복 가능한 키-값 쌍과 병합합니다.

  • 키가 d에 없으면 의 키-값 쌍이 d에 추가됩니다.
  • 키가 d에 이미 있는 경우 해당 키에 대한 d의 해당 값이 으로 대체됩니다.
In [ ]:
d1 = {'a': 10, 'b': 20, 'c': 30}
d2 = {'b': 200, 'd': 400}

d1.update(d2)
d1
In [ ]:
d1 = {'a': 10, 'b': 20, 'c': 30}
d1.update([('b', 200), ('d', 400)])
d1

또는 병합할 값을 키워드 인수 목록으로 지정할 수 있습니다.

In [ ]:
d1 = {'a': 10, 'b': 20, 'c': 30}
d1.update(b=200, d=400)
d1
In [ ]:
출처 : https://realpython.com/python-dicts/