본문 바로가기
Python/Python 개념

파이썬 자료구조(심화)-1

by hyun-am 2020. 9. 16.

파이썬 기본적인 자료구조

 

먼저 기본적으로 앞에서 list, tuple, dict을 설명했습니다. 이제 다른 자료구조와 앞에서 배웠던 자료구조 기반으로 만들어진 라이브러리 자료 구조를 확인하겠습니다.

 

Dict 기반 자료구조

 

collections.OrderDict

 

먼저 파이썬 3.6버전 이전에는 dict에 데이터를 삽입해도 순서대로 저장된다는 보장이 없었습니다. 그래서 OrderDict를 사용했는데 요즘 3.6 버전 이후에 dict는 OrderDict의 기능을 가지고 있어서 굳이 OrderDict를 사용 안해도 순서대로 저장이 됩니다.

하지만 만약 키의 순서를 매우 중요하게 여기는 경우 OrderDict로 dict를 선언하는 것을 추천합니다.

 

OrderDict는 키의 삽입 순서를 유지하는 Dict의 서브 클래스 입니다. 다음은 OrderDict 사용 예시입니다.

from collections import OrderedDict

data = OrderedDict(가=1,나=2,다=3) # dict를 만들어 줍니다

print(data)

data['라'] = 4 # dict에 값을 넣어줍니다.

print(data)

print(data.keys()) # dict의 키값을 출력 합니다

# 출력 값
# OrderedDict([('가', 1), ('나', 2), ('다', 3)])
# OrderedDict([('가', 1), ('나', 2), ('다', 3), ('라', 4)])
# odict_keys(['가', '나', '다', '라'])

 

collections.defaultdict

 

defaultdict는 누락된 키의 기본값을 반환해줍니다. 이것을 이용하면 get( )메서드를 사용하거나 KeyError와 같은 예외처리를 잡아내는 것과 비교하여 코드의 길이를 줄일 수 있습니다.

코드는 다음과 같습니다.

from collections import defaultdict

dict_data = defaultdict(list)

dict_data['한국'].append('서울')
dict_data['일본'].append('도쿄')
dict_data['중국'].append('베이징')

print(dict_data['한국'])
print(dict_data['미국'])

# 출력 값
# ['서울']
# []

 

collections.ChainMap

 

collections.ChainMap는 여러 개의 딕셔너리를 하나의 매핑으로 그룹화 합니다. 예시 코드는 다음과 같습니다.

from collections import ChainMap

dict_data1 = {1:"one",2:"two"}
dict_data2 = {3:"삼",4:"사"}
dict_data3 = {'a':'가','b':'나'}

chain_dict_data = ChainMap(dict_data1,dict_data2,dict_data3)

print(chain_dict_data)
print(chain_dict_data[1],chain_dict_data[4],chain_dict_data['b'])

# 출력 값
# one 사 나

 

types.MappingProxyType

 

types.MappingProxyType는 읽기전용 딕셔너리를 만들기 위한 래퍼입니다. 이 클래스는 파이썬 3.3이후에 추가 되었습니다.

사용 예시는 다음과 같습니다

from types import MappingProxyType

writable_data = {'가':1,"나":2}
read_only_data = MappingProxyType(writable_data)

print(read_only_data['가'])

read_only_data['다'] = 3

# 출력 값 
# 1
# TypeError: 'mappingproxy' object does not support item assignment

만약 수정을 하고 싶으면 원본 데이터를 수정하면 됩니다.

writable_data['가'] = 65
print(read_only_data)
# 출력 값
# {'가': 65, '나': 2}

 

tuple 기반 자료구조

 

collections.namedtuple

 

namedtuple은 tuple의 확장판 입니다. 네임드 튜플 객체는 내부적으로 일반 파이썬 클래스로 구현이 됩니다. 또한 메모리 사용량에 관해서도 일반 클래스보다 더 좋으며 일반 튜플만큼 효율적 입니다.

 

먼저 namedtuple의 예시는 다음과 같습니다.

from collections import namedtuple
from sys import getsizeof

Car = namedtuple('Car','color mileage automatic')
tuple_car = ('black',123424,True)
car1 = Car('black',123424,True)

print(car1)
print(car1.mileage)

print("튜플 크기 :",getsizeof(tuple_car))
print("네임드 튜플 크기:",getsizeof(car1))

# 출력 값
# Car(color='black', mileage=123424, automatic=True)
# 123424
# 튜플 크기 : 64
# 네임드 튜플 크기: 64

 

또한 튜플과 마찬가지로 값을 수정 또는 추가할 수 없습니다.

car1.color = 'red'
# 출력 값
# AttributeError: can't set attribute
car1.wide = True
# 출력 값
# AttributeError: 'Car' object has no attribute 'wide'

 

typing.NamedTuple

 

다음은 파이썬 3.6버전 이후에 출시된 개정된 네임드 튜플입니다. 위에 있는 네임드 튜플과 다른점은 레코드 타입을 정의하고 그것에 대한 힌트를 준다는 것입니다. 사용 예시는 다음과 같습니다.

from typing import NamedTuple

class Car(NamedTuple):
    color : str
    mileage : float
    automatic : bool

truck = Car('white',15000.123,False)

print(truck)
print(truck.automatic)

# 출력 값
# Car(color='white', mileage=15000.123, automatic=False)
# False

 

Set기반 자료구조

 

frozenset

 

frozenset 클래스는 이름 그대로 set인데 불변으로 생성한 set입니다. 정적이며 해시가 가능하기 때문에 딕셔너리의 키 또는 다른 세트의 요소로 사용될때 많이 사용됩니다.

사용예시는 아래와 같습니다.

모음 = frozenset({'ㅏ','ㅑ','ㅓ','ㅕ','ㅗ','ㅛ','ㅜ','ㅠ','ㅡ','ㅣ'})

모음.add('ㄱ')

# 출력 값
# AttributeError: 'frozenset' object has no attribute 'add'

이제 딕셔너리의 키로 사용하겠습니다.

dict_data = {모음 : '한글'}
print(dict_data[모음])
# 출력 값
# 한글

 

collections.Counter

 

collections.Counter는 요소가 두 번 이상 나타날 수 있는 멀티세트 타입을 구현합니다.

이것은 세트에 포함된 '횟수'를 추적해야 할 때 유용합니다.

from collections import Counter

data_list = [1,5,3,1,54,2,3,1,2,5,2,3,1,25,5,2,3,2,1,2,3,2,4]

counter = Counter(data_list)

print(counter)
# 출력 값
# Counter({2: 7, 1: 5, 3: 5, 5: 3, 54: 1, 25: 1, 4: 1})

이런식으로 리스트의 속한 숫자의 개수를 구할때 편하게 구할 수 있습니다.

또한 아래와 같은 코드를 통해 숫자의 종류는 몇개인지 또, 숫자는 총 합 몇개있는지 확인할 수 있습니다.

print("숫자 종류 :",len(counter))
print("모든 숫자 개수 :",sum(counter.values()))
# 출력 값
# 숫자 종류 : 7
# 모든 숫자 개수 : 23

'Python > Python 개념' 카테고리의 다른 글

파이썬 반복과 이터레이터  (0) 2020.09.22
파이썬 자료구조(심화)-2  (0) 2020.09.17
얕은 복사와 깊은 복사  (0) 2020.09.16
*args와 **kwargs  (0) 2020.09.14
파이썬 - 데코레이터  (0) 2020.09.14

댓글