목록
목록은 대괄호(())로 표시되는 정렬된 데이터 집합입니다. 항목은 쉼표로 구분됩니다. 목록을 수정할 수 있으며 인덱싱 및 파티셔닝을 통해 데이터에 액세스할 수 있습니다.
예:
a = (1, 2, 3, 4, 5) # 리스트 생성
print(a) # (1, 2, 3, 4, 5)
print(a(0)) # 1
print(a(2:4)) # (3, 4)
a(1) = 10 # 리스트 값 수정
print(a) # (1, 10, 3, 4, 5)
튜플
튜플은 목록과 유사하지만 수정할 수 없습니다. 괄호(())로 표시됩니다.
예:
a = (1, 2, 3) # 튜플 생성
print(a) # (1, 2, 3)
print(a(0)) # 1
a(1) = 10 # TypeError: 'tuple' object does not support item assignment
문장
세트는 중괄호({})로 표현되는 중복되지 않는 데이터 세트입니다.
예:
a = {1, 2, 3} # 집합 생성
print(a) # {1, 2, 3}
b = {3, 4, 5}
print(a.union(b)) # {1, 2, 3, 4, 5}
사전
사전은 중괄호({})로 표시되는 키-값 쌍의 데이터 집합입니다. 키로 값에 액세스할 수 있습니다.
예:
a = {'apple': 1000, 'banana': 2000, 'orange': 1500} # 딕셔너리 생성
print(a) # {'apple': 1000, 'banana': 2000, 'orange': 1500}
print(a('apple')) # 1000
a('banana') = 2500 # 딕셔너리 값 수정
print(a) # {'apple': 1000, 'banana': 2500, 'orange': 1500}
스택
스택은 데이터를 푸시하고 저장할 수 있는 데이터 구조입니다. 마지막으로 입력한 데이터를 먼저 빼내는 LIFO(후입선출) 방식입니다. Python에서는 목록을 사용하여 스택을 구현할 수 있습니다.
예:
stack = ()
stack.append(1) # push
stack.append(2)
stack.append(3)
print(stack) # (1, 2, 3)
print(stack.pop()) # 3 (pop)
print(stack) # (1, 2)
대기줄
큐는 큐에 넣기 및 큐에서 빼기 작업을 가능하게 하는 데이터 구조입니다. 데이터가 선입선출되는 선입선출(FIFO) 시스템을 따릅니다. Python에서는 컬렉션 모듈의 deque 클래스를 사용하여 구현할 수 있습니다.
예:
from collections import deque
a = deque((1, 2, 3)) # 큐 생성
a.append(4) # enqueue
print(a) # deque((1, 2, 3, 4))
a.popleft() # dequeue
print(a) # deque((2, 3, 4))
더미
힙은 최소값 또는 최대값을 빠르게 찾기 위한 이진 트리 기반 데이터 구조입니다. 부모 노드와 자식 노드의 관계를 이용하여 정렬된 트리를 구현한 데이터 구조입니다. 최소 힙에서는 부모 노드의 값이 자식 노드의 값보다 작거나 같고, 최대 힙에서는 부모 노드의 값이 자식 노드의 값보다 크거나 같습니다. Python에서는 heapq 모듈을 사용하여 힙을 구현할 수 있습니다.
예:
import heapq
a = (3, 1, 4, 1, 5, 9, 2, 6, 5)
heapq.heapify(a) # 힙 생성
print(a) # (1, 1, 2, 6, 5, 9, 4, 3, 5)
print(heapq.heappop(a)) # 1 (최솟값)
print(a) # (1, 3, 2, 6, 5, 9, 4, 5)
import heapq
heap = ()
heapq.heappush(heap, 3)
heapq.heappush(heap, 1)
heapq.heappush(heap, 2)
print(heap) # (1, 3, 2)
print(heapq.heappop(heap)) # 1
print(heap) # (2, 3)
그래프
그래프는 노드와 에지로 구성된 데이터 구조입니다. Python에서는 dict 유형을 사용하여 구현할 수 있습니다.
예:
graph = {
'A': ('B', 'C'),
'B': ('A', 'D'),
'C': ('A', 'E'),
'D': ('B'),
'E': ('C')
}
print(graph('A')) # ('B', 'C')
위와 같이 Python은 다양한 데이터 구조를 제공하며 이를 적절히 활용하여 프로그램을 작성할 수 있습니다.
해시 테이블
해시 테이블은 데이터를 키-값 쌍으로 저장하는 데이터 구조입니다. 키를 사용하여 값을 검색, 삽입 또는 삭제하는 것은 매우 효율적입니다. Python에서는 Dictionary 유형을 통해 구현할 수 있습니다.
예:
hash_table = {}
hash_table('one') = 1
hash_table('two') = 2
hash_table('three') = 3
print(hash_table) # {'one': 1, 'two': 2, 'three': 3}
print(hash_table('one')) # 1
시도
트라이는 문자열 검색을 위한 효율적인 데이터 구조입니다. 문자열의 문자를 노드로 표현하고 저장하는 트리 구조입니다. 파이썬에서는 별도의 모듈 없이 딕셔너리를 이용해 구현할 수 있다.
예:
trie = {}
def insert(string):
cur = trie
for char in string:
if char not in cur:
cur(char) = {}
cur = cur(char)
cur('*') = True
insert('hello')
insert('world')
print(trie) # {'h': {'e': {'l': {'l': {'o': {'*': True}}}}}, 'w': {'o': {'r': {'l': {'d': {'*': True}}}}}}
문장
집합은 중복되지 않은 데이터를 저장하는 데이터 구조입니다. Python에서는 set 유형을 사용하여 구현할 수 있습니다.
예:
set1 = set((1, 2, 3))
set2 = set((2, 3, 4))
print(set1 & set2) # {2, 3} (교집합)
print(set1 | set2) # {1, 2, 3, 4} (합집합)
print(set1 - set2) # {1} (차집합)
데크
데크는 양쪽 끝에서 삽입 및 삭제할 수 있는 데이터 구조입니다. Python에서는 컬렉션 모듈의 deque 클래스를 사용하여 구현할 수 있습니다.
예:
from collections import deque
d = deque((1, 2, 3))
d.appendleft(0) # 왼쪽에 추가
print(d) # deque((0, 1, 2, 3))
d.extend((4, 5)) # 오른쪽에 추가
print(d) # deque((0, 1, 2, 3, 4, 5))
d.pop() # 오른쪽에서 꺼냄
print(d) # deque((0, 1, 2, 3, 4))
주문형
OrderedDict는 사전과 유사한 데이터 구조이지만 키-값 쌍이 추가된 순서를 기억합니다. Python에서는 Collections 모듈의 OrderedDict 클래스를 사용하여 구현할 수 있습니다.
예:
from collections import OrderedDict
d = OrderedDict()
d('banana') = 3
d('apple') = 4
d('pear') = 1
print(d) # OrderedDict((('banana', 3), ('apple', 4), ('pear', 1)))
Python에서 제공하는 다양한 데이터 구조를 적절하게 사용하면 프로그램의 효율성을 높일 수 있습니다.
기본 사전
기본 사전은 존재하지 않는 키에 대해 값을 지정할 수 있는 사전입니다. 존재하지 않는 키에 액세스할 때 기본값을 반환합니다. Python에서는 collections 모듈의 defaultdict 클래스를 사용하여 구현할 수 있습니다.
예:
from collections import defaultdict
d = defaultdict(int)
d('apple') += 1
d('banana') += 2
print(d) # defaultdict(<class 'int'>, {'apple': 1, 'banana': 2})
스위치
카운터는 시퀀스(문자열, 목록 등)의 각 요소를 계산할 수 있는 사전 하위 클래스입니다. Python에서는 컬렉션 모듈의 Counter 클래스를 사용하여 구현할 수 있습니다.
예:
from collections import Counter
c = Counter('hello, world')
print(c) # Counter({'l': 3, 'o': 2, ' ': 2, 'e': 1, 'h': 1, ',': 1, 'w': 1, 'r': 1, 'd': 1})
명명된 튜플
Python에서 명명된 튜플은 일반 튜플과 비슷하지만 각 요소에 이름을 지정할 수 있는 클래스입니다. 명명된 튜플을 사용하면 인덱스를 사용하는 대신 이름으로 튜플의 요소에 액세스할 수 있으므로 코드를 더 읽기 쉽고 직관적으로 만들 수 있습니다.
명명된 튜플을 정의하는 방법 collections 모듈에서 namedtuple 함수를 가져오고 이름과 필드 이름을 지정하십시오. 필드 이름은 문자열로 지정되며 여러 필드 이름은 쉼표로 구분됩니다. 다음 Point이름이 지정된 튜플을 정의하는 예입니다.
from collections import namedtuple
Point = namedtuple('Point', ('x', 'y'))
위의 코드에서 namedtuple 함수의 첫 번째 인수는 명명된 튜플의 이름입니다. Point, 필드 이름 목록을 두 번째 인수로 전달합니다. 지금 Point 클래스는 일반 클래스처럼 사용할 수 있습니다. 다음 Point 클래스의 객체를 생성하는 예제입니다.
p = Point(1, 2)
위의 코드에서 Point 클래스의 객체 p만들다, x그리고 y명명된 각 필드에서 1수업 2의 값을 할당했습니다. 명명된 튜플의 필드에 액세스할 때 .다음으로 액세스할 수 있습니다. p 객체의 필드에 접근하는 예제입니다.
print(p.x) # 출력: 1
print(p.y) # 출력: 2
명명된 튜플은 일반 튜플의 모든 기능을 지원하고 변경할 수 없으므로 변경할 수 없습니다. 명명된 튜플의 이점은 코드를 더 읽기 쉽고 직관적으로 만든다는 것입니다. 특히, 함수에서 여러 값을 반환할 때 튜플 대신 네임드 튜플을 사용하면 반환 값에 대한 설명을 추가하여 함수의 사용법을 더 명확하게 한다.