Python은 데이터를 효율적으로 저장하고 관리할 수 있도록 다양한 내장 데이터 구조를 제공합니다. 이 글에서는 가장 많이 사용되는 4가지 데이터 구조인 리스트(List), 딕셔너리(Dictionary), 튜플(Tuple), 셋(Set)의 특징과 사용법을 예제 코드와 함께 자세히 살펴보겠습니다.
1. 리스트(List)
리스트는 순서가 있는 요소들의 시퀀스입니다. 비스칼라(non-scalar) 자료 구조로, 변경 가능(mutable)하다는 것이 가장 큰 특징입니다. 또한 동일한 데이터 타입만 저장할 수 있는 배열과 달리, 리스트에는 서로 다른 데이터 타입의 요소들을 함께 담을 수 있습니다.
리스트의 요소는 대괄호([]) 안에 인덱스를 넣어 접근할 수 있습니다.
다음 예제를 통해 리스트의 기본 동작을 확인해 보겠습니다.
예제 코드
lis = ['tutorialspoint', 786, 34.56, 2+3j]
# 리스트의 요소 출력하기
for i in lis:
print(i)
# 리스트 끝에 새로운 요소 추가하기
lis.append('python')
# 리스트의 길이 출력하기
print("리스트의 길이:", len(lis))
# 리스트의 마지막 요소 제거하기
lis.pop()
print(lis)
실행 결과
tutorialspoint 786 34.56 (2+3j) 리스트의 길이: 5 ['tutorialspoint', 786, 34.56, (2+3j)]
append() 메서드로 요소를 추가했기 때문에 길이가 5가 되었고, pop()으로 마지막 요소가 제거된 것을 확인할 수 있습니다.
2. 튜플(Tuple)
튜플 역시 Python에서 제공하는 비스칼라 타입입니다. 리스트처럼 순서가 있는 시퀀스이지만, 튜플은 불변(immutable)이라는 결정적인 차이점이 있습니다. 즉, 한 번 생성된 튜플은 요소를 추가, 삭제, 수정할 수 없습니다.
튜플의 요소는 괄호() 안에 쉼표로 구분하여 작성하며, 서로 다른 타입의 요소도 함께 담을 수 있습니다. 데이터를 읽기 전용으로 보관해야 하는 경우 튜플이 유용합니다.
예제 코드
tup = ('tutorialspoint', 786, 34.56, 2+3j)
# 튜플의 요소 출력하기
for i in tup:
print(i)
# 튜플은 불변이므로 아래 코드는 에러 발생
# tup.append('python') # AttributeError!
# tup.pop() # AttributeError!
# 튜플의 길이 출력하기
print("튜플의 길이:", len(tup))
실행 결과
tutorialspoint 786 34.56 (2+3j) 튜플의 길이: 4
주석 처리된 append()나 pop()을 실행하면 AttributeError가 발생하는데, 이것이 바로 튜플이 불변 자료 구조라는 것을 보여주는 예시입니다.
3. 셋(Set)
셋은 중복을 허용하지 않는 순서 없는 객체의 집합입니다. 모든 요소를 중괄호({})로 감싸 생성할 수 있으며, set() 함수를 이용한 타입 변환으로도 만들 수 있습니다.
셋의 요소는 반드시 불변 타입이어야 합니다. 셋은 인덱싱, 슬라이싱, 연결(concatenation), 반복(replication) 연산을 지원하지 않지만, for 루프를 통해 요소를 순회할 수 있습니다.
예제 코드
set_ = {'tutorial', 'point', 'python'}
# 셋의 요소 출력하기
for i in set_:
print(i, end=" ")
print()
# 최댓값과 최솟값 출력하기
print(max(set_))
print(min(set_))
# 셋의 크기 출력하기
print(len(set_))
실행 결과
tutorial point python tutorial point 3
셋은 중복을 허용하지 않고 순서가 없기 때문에, 같은 요소를 여러 번 넣어도 하나만 저장되며 출력 순서는 실행 시마다 달라질 수 있습니다.
4. 딕셔너리(Dictionary)
딕셔너리는 키(key)와 값(value)의 쌍으로 이루어진 순서 없는 자료 구조입니다. 키는 문자열, 숫자 등 어떤 불변 타입이든 사용할 수 있으며, 딕셔너리 역시 중괄호({})로 정의합니다.
저장된 값은 각각 고유한 키를 통해 빠르게 접근할 수 있다는 점이 리스트와 큰 차이입니다.
예제 코드
# 빈 딕셔너리 생성하기 d = dict() # 키-값 쌍 추가하기 d['tutorial'] = 786 d['point'] = 56 # 최솟값과 최댓값 키 출력하기 print(min(d), max(d)) # 키만 출력하기 print(d.keys()) # 값만 출력하기 print(d.values())
실행 결과
point tutorial dict_keys(['tutorial', 'point']) dict_values([786, 56])
keys()와 values() 메서드를 사용하면 딕셔너리의 키와 값을 각각 손쉽게 조회할 수 있습니다.
마무리
이 글에서는 Python에 내장된 4가지 핵심 데이터 구조의 특징과 구현 방법을 알아보았습니다. 각 구조를 간단히 요약하면 다음과 같습니다.
- 리스트: 순서 O, 변경 가능, 다양한 타입 저장 가능
- 튜플: 순서 O, 변경 불가능, 읽기 전용 데이터에 적합
- 셋: 순서 X, 중복 허용 안 함, 집합 연산에 유용
- 딕셔너리: 키-값 쌍 구조, 키로 빠른 조회 가능
각 데이터 구조의 특성을 정확히 이해하고 상황에 맞게 선택하면, 더욱 효율적이고 가독성 좋은 Python 코드를 작성할 수 있습니다.