자료형 3. 딕셔너리와 집합

변현섭·2023년 7월 26일
0

5. 딕셔너리 자료형

1) 딕셔너리 생성하기

딕셔너리는 key-value 쌍을 저장하는 자료구조이다. C++의 Map 또는 Unordered Map, 자바의 Map 또는 Hash Map과 유사하다. 각각의 key-value 쌍은 쉼표로 구분된다. 용도는 다르지만, 형식 자체는 Json과 유사하기도 하다.

>>> dic = {'name': 'pey', 'phone': '010-9999-1234', 'birth': '1118'}

2) 딕셔너리의 삽입 및 삭제 연산

① 딕셔너리에 추가

  • 배열의 인덱스를 나타내는 방식과 동일하게 key를 입력
  • 요소의 값을 대입하는 방식으로 value를 입력
>>> a = {1: 'a'}
>>> a[2] = 'b'
>>> a
{1: 'a', 2: 'b'}

② 딕셔너리에서 삭제

  • C++이나 Java에서와 마찬가지로 key를 이용하여 삭제를 진행
  • del 함수 이용
>>> a
{1: 'a', 2: 'b', 'name': 'pey'}
>>> del a[1]
>>> a
{2: 'b', 'name': 'pey'}

3) 딕셔너리의 특징

① 정수 인덱싱 사용 불가

  • 배열이나 리스트에선, 인덱싱 연산으로 value를 찾는 반면, 딕셔너리는 키 값으로 value를 찾는다.
  • 파이썬의 딕셔너리는 순서가 없는(unordered) 자료구조이기 때문에 정수 인덱싱 연산은 아예 사용할 수 없다.
>>> grade = {'pey': 10, 'julliet': 99}
>>> grade['pey']
10
>>> grade['julliet']
99

② 중복 키 불허

  • 동일한 key가 2개 이상 존재할 경우, 하나를 제외한 나머지 key-value 쌍은 모두 무시된다.
>>> a = {1:'a', 1:'b'}
>>> a
{1: 'b'}

③ 키 값 불변 보장

  • 이건 딕셔너리의 특징만이 아니라, key-value쌍의 데이터를 저장하는 모든 상황에서 지켜져야 할 규칙이다.
  • 키 값은 변할 수 없는(immutable) 값이어야 한다. 변할 수 없는 값에는 정수, 문자열, 튜플 등이 있다.

4) 딕셔너리 관련 함수

① keys

  • 딕셔너리의 key를 모아 dict_keys 객체를 반환한다.
  • dict_keys는 리스트와 비슷하게 사용 가능하지만, 리스트 관련 메서드를 사용할 수는 없다.
>>> a = {'name': 'pey', 'phone': '010-9999-1234', 'birth': '1118'}
>>> a.keys()
dict_keys(['name', 'phone', 'birth'])
  • 리스트로 변환해야 한다면, 아래와 같은 방법을 사용하면 된다.
>>> list(a.keys())
['name', 'phone', 'birth']

② values

  • 딕셔너리의 value를 모아 dict_values 객체를 반환한다.
>>> a.values()
dict_values(['pey', '010-9999-1234', '1118'])

③ get

  • key에 대응되는 value를 반환한다.
  • 대괄호 안에 키 값을 넣는 방식을 사용할 수도 있지만, 일반적으로 get 사용을 권장한다.
>>> a = {'name': 'pey', 'phone': '010-9999-1234', 'birth': '1118'}
>>> a.get('name') or a['name']
'pey'

get 메서드의 인자로 존재하지 않는 key가 입력되면 None을 반환하지만, 대괄호 안에 존재하지 않는 key를 입력하면 에러가 발생한다. key가 존재하지 않는지 확인하는 경우도 많기 때문에 get을 사용하는 것이 훨씬 안전한 방법이다. 참고로, get은 None을 대신할 디폴트 값을 설정하는 것도 가능하다.

>> a = {'name':'pey', 'phone':'010-9999-1234', 'birth': '1118'}
>> print(a.get('nokey'))
None
>> a.get('nokey', 'foo')
'foo'

④ in

  • 해당 key가 딕셔너리에 존재하는지 여부를 True/False로 반환한다.
>>> a = {'name':'pey', 'phone':'010-9999-1234', 'birth': '1118'}
>>> 'name' in a
True
>>> 'email' in a
False

6. 집합 자료형

1) 집합 생성하기

set 키워드를 이용하여 집합을 만들 수 있다. set의 소괄호 안에는 리스트를 입력할 수도 있고, 문자열을 입력할 수도 있다.

>>> s1 = set([1, 2, 3])
>>> s1
{1, 2, 3}
>>> s2 = set("Hello")
>>> s2
{'e', 'H', 'l', 'o'}

2) 집합 자료형의 특징

사실 파이썬의 Set은 자바의 Set과 동일하다. 즉, Java의 Set과 동일한 특징을 지닌다. 그 특징은 아래와 같다.

① 중복을 허용하지 않는다.

  • Java에서 데이터 중복을 제거하기 위한 목적으로 Set을 사용했듯, 파이썬의 Set도 중복 제거 필터의 역할로 자주 사용된다.

② 순서가 없다(Unordered).

  • 순서가 없다는 것에서 딕셔너리를 떠올려야 한다.
  • 집합 자료구조도 딕셔너리와 마찬가지로 정수 인덱싱을 지원하지 않는다.
  • 하지만 집합에는 key가 없기 때문에 특정 값에 접근하기 위해서는 리스트나 튜플로 형변환해주어야 한다.
>>> s1 = set([1, 2, 3])
>>> l1 = list(s1)
>>> l1
[1, 2, 3]
>>> l1[0]
1

3) 집합 연산

Java에서 집합 연산은 메서드의 형태로 이루어지는 반면, 파이썬의 집합 연산은 간단한 기호로 이루어진다. 집합 연산의 예시에 사용하기 위해 아래와 같은 집합을 가정하자.

>>> s1 = set([1, 2, 3, 4, 5, 6])
>>> s2 = set([4, 5, 6, 7, 8, 9])

① 교집합

  • &를 이용하여 교집합을 구할 수 있다.
>>> s1 & s2
{4, 5, 6}

② 합집합

  • |를 이용하여 합집합을 구할 수 있다.
  • 참고로 "|"는 조건식에서 or을 의미하는 기호로써, 합을 나타내는 용도로 쓰인다.
  • union이라는 메서드를 사용할 수도 있다.
>>> s1 | s2
{1, 2, 3, 4, 5, 6, 7, 8, 9}
>>> s1.union(s2)
{1, 2, 3, 4, 5, 6, 7, 8, 9}

③ 차집합

  • -를 이용하여 차집합을 구할 수 있다.
  • difference 메서드를 사용할 수도 있다.
>>> s1 - s2
{1, 2, 3}
>>> s1.difference(s2)
{1, 2, 3}

4) 집합 관련 함수

① add

  • set 자료형에 하나의 값만을 추가하기 위해 사용
>>> s1 = set([1, 2, 3])
>>> s1.add(4)
>>> s1
{1, 2, 3, 4}

② update

  • 여러 개의 값을 한꺼번에 추가하기 위해 사용
>>> s1 = set([1, 2, 3])
>>> s1.update([4, 5, 6])
>>> s1
{1, 2, 3, 4, 5, 6}

③ remove

  • 특정 값을 제거하기 위해 사용
>>> s1 = set([1, 2, 3])
>>> s1.remove(2)
>>> s1
{1, 3}
profile
Java Spring, Android Kotlin, Node.js, ML/DL 개발을 공부하는 인하대학교 정보통신공학과 학생입니다.

0개의 댓글