사전(Dictionary)
내용
사전 객체의 생성
리스트나 튜플 객체와 같이 파이썬의 컬렉션이지만 각 요소에 인덱스가 부여되지 않습니다. 대신에 각 요소는 식 1에서 나타낸 형식과 같이 "키: 값"과 같이 구성됩니다. 이 형식의 키(key)는 값(value)에 대한 인덱스 역할을 합니다.
{key1: value1, key2: value2, …} | (식 1) |
사전 객체는 다음의 특성을 가집니다.
사전(Dictionary)
- 중괄호({ }) 또는 dict()함수를 사용하여 생성 합니다.
- 사전 내의 요소들은 순서가 없으며 {key:value}의 형식으로 입력합니다.
- key는 리스트, 튜플 형의 인덱스와 같은 역할을 합니다. 즉, 사전 객체의 요소를 호출하기 위해서 key를 사용합니다.
- value의 자료형은 제한이 없으며 반복, 수정 할 수 있습니다. 그러나 key는 고유한 값이어야 하며 변경할 수 없습니다.
사전 객체는 비어있는 중괄호로 객체를 선언한 후 키에 값을 할당하는 방식으로 생성할 수 있습니다. 이 경우 객체에 요소는 '객체이름[이름]=값'와 같이 할당합니다.
dic1={} #빈객체 dic1
{}
dic1[1]='one' # 1:key, 'one':value dic1[2]="two" # 2:key, 'two':value dic1
{1: 'one', 2: 'two'}
또 다른 생성 방법은 요소의 이름과 값을 중괄호 내에 {key: value} 형식으로 직접 입력합니다.
dic2={"one":1, "two":2} ;dic2
{'one': 1, 'two': 2}
3번째 방법은 dic({key: value})
함수를 적용하는 것입니다.
dic3=dict({"apple":"사과", "pear":"배"}); dic3
{'apple': '사과', 'pear': '배'}
dic()함수내에 dic([(key, valye)])와 같이 key와 value를 튜플로 전달하여 생성할 수 있습니다.
dic4=dict([(1, "A"), (2, "B")]); dic4
{1: 'A', 2: 'B'}
사전에서 키(key)는 대응하는 값(value)의 인식자(identifier) 역할을 합니다. 그러므로 별도의 인덱스가 필요없는 구조입니다. 실제로 사전형 객체의 각 요소는 인덱스가 할당되지 않기 때문에 요소들의 순서는 지정되지 않기 때문에 사전객체는 시퀀스(sequence)가 아닙니다. 그러나 인덱스 대신에 key에 의해 값을 하나씩 호출할 수 있으므로 이터러블(iterable)입니다(시퀀스, 이터러블 참조).
사전객체의 이름과 값 그리고 그 둘을 호출하기 위해 메서드 .keys(), .values()
그리고 .items()
를 사용합니다.
x={1: 'one', 2: 'two'} x.keys()
dict_keys([1, 2])
x.values()
dict_values(['one', 'two'])
x.items()
dict_items([(1, 'one'), (2, 'two')])
사전은 가변(mutable)객체
사전 객체는 다음과 같이 인덱스 대신에 key를 사용하여 요소를 호출합니다.
- 객체[key]: key가 없는 경우 에러 발생
객체.get(key, val=None)
: key가 없는 경우 val을 반환, val을 지정하지 않을 경우 결과물이 없음(None)
dic={1:"A", 2:"B"} dic[1]
'A'
dic[3]
KeyError: 3
dic.get(2)
'B'
dic.get(3, "None")
'None'
print(dic.get(4))
None
사전의 key는 인덱스와 같은 역할을 하므로 key를 사용하여 대응하는 값을 수정할 수 있으며 새로운 키와 값을 할당할 수 있습니다.
dic
{1: 'A', 2: 'B'}
dic[3]='C'; dic
{1: 'A', 2: 'B', 3: 'C'}
dic[2]="새로운 값으로 변경"; dic
{1: 'A', 2: '새로운 값으로 변경', 3: 'C'}
사전 객체의 복사는 리스트의 복사와 동일한 방식으로 이루어 집니다.
a_dic={1: 'A', 2: '새로운 값으로 변경', 3: 'C'} b_dic=a_dic b_dic==a_dic
True
b_dic is a_dic
True
c_dic=a_dic.copy() c_dic is a_dic
False
사전형의 대표적인 메서드(Methods)
메서드 | 내용 |
---|---|
.keys() | 객체의 key들을 반환 |
.values() | 객체의 value들을 반환 |
.items() | 객체의 key와 value들을 tuple 형식으로 반환 |
.update(x) | 객체에 다른 사전형객체 x를 첨가. 동일한 key가 존재한다면 첨가되는 부분에 의해 치환 |
.copy() | 리터럴과 요소 객체 자체의 복사는 깊은 복사를 수행 그러나 요소로서 컬렉트의 세부요소를 수정할 경우 얕은복사 |
.clear() | 객체의 모든 요소를 제거 |
.pop(key, d) | key에 해당하는 요소를 삭제 key가 존재하지 않는 경우 d를 반환 객체에 key가 존재하지 않고 d가 주어지지 않는다면 에러 발생 |
.popitem() | 객체의 요소중 하나를 임의적으로 제거 빈 객체이면 에러발생 |
dict.fromkeys(x, y) | x, y: 리스트, 튜플형의 객체(iterable 객체) x를 key, y를 values로 하는 사전형 객체를 생성 y의 기본값은 none 입니다. dict: 빈 사전 객체를 의미하는 것으로 어떤 명칭도 가능 |
.setdefault(key, d) | 객체에 key가 존재하면 대응하는 값을 반환 key가 없을 경우 key:d를 객체에 삽입. d의 기본값은 none |
A={1: 'one', 2: 'two', 3: 'three'}; A
{1: 'one', 2: 'two', 3: 'three'}
.keys(), .values(), items() 메소드를 사용하여 키와 값 또는 둘 모두를 호출할 수 있습니다. 이 결과물은 다음과 같이 사전 클래스에서 한정되어 동작하는 자료형입니다.
print(type(A.keys())) print(type(A.values())) print(type(A.items()))
<class 'dict_keys'> <class 'dict_values'> <class 'dict_items'>
A.values()
dict_values(['one', 'two', 'three'])
.keys(), .values(), items() 메소드를 사용하여 키와 값 또는 둘 모두를 호출할 수 있습니다. 이 결과물은 다음과 같이 사전 클래스에서 한정되어 동작하는 자료형입니다.
print(type(dic.keys())) print(type(dic.values())) print(type(dic.items()))
<class 'dict_keys'> <class 'dict_values'> <class 'dict_items'>
list(dic.keys())
[1, 2, 3]
일반적으로 가장 유연하게 다양한 분야에 적용되는 데이터 형은 리스트 형입니다. 예로 데이터 분석을 위한 필수적인 패키지 numpy, scipy, sklearn등의 피키지는 리스트 형을 기본형으로 사용합니다. 그러므로 사전형으로부터 추출한 키, 값을 리스트 형으로 전환이 필요한 경우가 존재합니다. 이 경우 list() 함수를 적용합니다.
list(A.values())
['one', 'two', 'three']
객체 A에 다른 사전형 객체 x와 y를 첨가합니다.
x={4:"four"} A.update(x) A
{1: 'one', 2: 'two', 3: 'three', 4: 'four'}
y={'rem':[10, 20, 30, 40]} A.update(y);A
{1: 'one', 2: 'two', 3: 'three', 4: 'four', 'rem': [10, 20, 30, 40]}
다른 자료형과 같이 다음 코드와 같이 객체 자체를 다른 객체에 할당하는 것으로 얕은복사를 실행합니다.
B=A B
{1: 'one', 2: 'two', 3: 'three', 4: 'four', 'rem': [10, 20, 30, 40]}
B[2]="TWO" B
{1: 'one', 2: 'TWO', 3: 'three', 4: 'four', 'rem': [10, 20, 30, 40]}
A
{1: 'one', 2: 'TWO', 3: 'three', 4: 'four', 'rem': [10, 20, 30, 40]}
메소드 .copy()
에 의해 깊은 복사를 실행합니다. 그러나 사전 객체의 요소인 내재된 리스트 객체 C["rem"]의 요소의 수정은 얕은 복사를 수행합니다(리스트 복사 참조).
C=A.copy() C
{1: 'one', 2: 'TWO', 3: 'three', 4: 'four', 'rem': [10, 20, 30, 40]}
C[2]='two' C
{1: 'one', 2: 'two', 3: 'three', 4: 'four', 'rem': [10, 20, 30, 40]}
A
{1: 'one', 2: 'TWO', 3: 'three', 4: 'four', 'rem': [10, 20, 30, 40]}
C["rem"][0]=1000 C
{1: 'one', 2: 'two', 3: 'three', 4: 'four', 'rem': [1000, 20, 30, 40]}
A
{1: 'one', 2: 'TWO', 3: 'three', 4: 'four', 'rem': [1000, 20, 30, 40]}
사전형 객체의 요소 제거를 위해 .pop(), .popitem()., .clear()
메소드를 사용합니다.
A.pop(2) 'TWO' A
{1: 'one', 3: 'three', 4: 'four', 'rem': [1000, 20, 30, 40]}
A.popitem()
('rem', [1000, 20, 30, 40])
A
{1: 'one', 3: 'three', 4: 'four'}
A.clear() A
{}
3.4.1절에서 사전객체를 생성하는 3가지 방법을 소개하였습니다. 이 방법들 외에 dict.fromkeys(x, y)
메소드를 적용하여 사전형 객체를 생성할 수 있습니다. 이 메소드의 인수 x는 리스트와 튜플과 같은 iterable 객체이며 생성되는 사전 객체의 key가 됩니다. y객체는 모든 key들의 값이 되며 기본값은 none이 됩니다.
x=['one','two', 'three'] d=A.fromkeys(x);d
{'one': None, 'two': None, 'three': None}
x=['one','two', 'three'] d=dict.fromkeys(x);d
{'one': None, 'two': None, 'three': None}
y=[1,2,3] d=dict.fromkeys(x, y);d
{'one': [1, 2, 3], 'two': [1, 2, 3], 'three': [1, 2, 3]}
3.4.2절에서 소개한 것과 같이 사전형 객체에서 요소 값의 호출은 단순히 키 또는 .get(키) 메소드를 적용합니다. 표 3.4.1에 나타낸 .setdefault()
메소드를 사용하여 요소의 호출 뿐 아니라 새로운 키와 값을 첨가시킬 수 있습니다.
d={1: 'one', 2: 'two', 4: 'four'} d.setdefault(2)
'two'
print(d.setdefault(3))
None
d.setdefault(5, "no")
'no'
d
{1: 'one', 2: 'two', 4: 'four', 3: None, 5: 'no'}
댓글
댓글 쓰기