최근 파이썬, C++으로 LeetCode로 알고리즘 문제를 해결하고 있다.
Pythonic한 코드를 작성하기 위해 파이썬 문법을 학습하던 중, List
와 Tuple
이 많이 비교되고 있는 것을 알았다.
점프 투 파이썬에 따르면, 튜플은 몇 가지의 점을 제외하고는 리스트와 거의 비슷하다는데
리스트와 튜플의 차이가 무엇인지, 주로 어디 쓰지는지를 알아보고자 하여 이 글을 작성한다.
List란 무엇일까
리스트는 다양한 자료형의 아이템을 여러 개 저장할 수 있는 가변적 데이터 구조이다.
따지자면 Java의 ArrayList
, C++의 vector
와 비슷하다고 볼 수 있는데, 풀어 설명하자면 아래와 같은 특징이 있다.
- 가변적으로 값을 삽입/삭제할 수 있다.
- 아이템이 삽입된 순서를 유지하여 인덱스를 통해 해당 위치의 값에 접근할 수 있다.
- 다양한 데이터 타입을 섞어 사용할 수 있다. (Mixed Data Types)
- for 루프와 같은 반복 구조에서 사용이 가능하다.
- 대괄호(
[]
)를 사용하여 표현한다.
my_list = [1, 2, "hello", [3, 4]]
my_list[1] = "changed"
my_list.append(5)
for my_item in my_list:
print(my_item) #[1, "changed", "hello", [3, 4], 5]
Tuple이란 무엇일까
그렇다면 리스트와 매우 비슷하다고 언급된 튜플이란 무엇일까?
튜플은 다양한 자료형의 아이템을 여러 개 저장할 수 있는 불변적 데이터 구조이다.
벌써 눈에 띄는 차이점이 보인다. 리스트와 다르게 튜플은 한번 생성하면 그 내용을 변경할 수 없다는 것이다.
튜플의 특징은 다음과 같다.
- 불변적이므로 생성 후 내용을 변경할 수 없다.
- 아이템이 삽입된 순서를 유지하여 인덱스를 통해 해당 위치의 값에 접근할 수 있다.
- 다양한 데이터 타입을 섞어 사용할 수 있다. (Mixed Data Types)
- for 루프와 같은 반복 구조에서 사용이 가능하다.
- 소괄호(
()
)를 사용하여 표현한다.
List와 Tuple의 사용 사례
특징을 살펴보았을 때 리스트와 거의 동일한 기능을 한다고 볼 수 있지만,
요솟값 변화 가능 여부라는 큰 차이로 인해 튜플과 리스트는 구별해서 사용해주는 것이 유리하다.
그렇다면 이들을 어떻게 사용하는 것이 적절한 상황에 맞게 사용하는 것일까?
리스트의 특징은 가변적이라는 것이다.
그 말은 즉, 데이터 삽입/수정/삭제가 빈번한 경우에 사용하는 것이 좋다는 말이다.
예를 들면, 사용자 정보 목록이나 음량·밝기 등의 게임 설정 값 등에 사용할 수 있다.
반면, 튜플의 특징은 불변적인 것이다.
값을 변경하지 못하는 게 자칫 불편하게 느껴질 수도 있지만, 무결성이 중요한 데이터들에게는 튜플을 사용하는 것이 훨씬 더 유리하다.
이러한 특징을 활용하는 데이터 예시로는 특정 장소의 (x, y) 좌표나 요일이 해당된다.
Tuple 연산
피치못하게 튜플에 요소를 추가하거나, 수정하고 싶다면 어떻게 해야할까?
아쉽지만 튜플은 한번 값이 들어가면 더이상 변화시킬 수 없다.
sort
, insert
, remove
, pop
과 같은 내장 함수가 없다는 것이 이를 적나라하게 보여준다.
현재 존재하는 튜플의 값은 변경할 수 없으나, 그 튜플 내에 담긴 값을 사용할 수 있다는 점을 이용하자.
이를 위해서 튜플 연산을 알아보고자 한다.
my_tuple = (1, 2, 3, 4, 5)
위와 같은 튜플이 존재한다고 가정하고, 해당 튜플을 조작해볼 것이다.
1. 인덱싱(Indexing) / 슬라이싱(Slicing)
print(my_tuple[0]) #1
print(my_tuple[1:3]) #(2, 3)
튜플은 리스트와 마찬가지로 특정 위치에 있는 값을 인덱스를 이용해 가져올 수 있다.
my_tuple[0]
과 같이 특정 요소를 가져오는 것을 인덱싱,
my_tuple[1:3]
과 같이 요소의 부분 집합을 가져오는 것을 슬라이싱이라 부른다.
2. 연결 (Concatenation): 튜플 더하기
add_tuple = (6, 7, 8)
new_tuple = my_tuple + add_tuple
#my_tuple = my_tuple + add_tuple #존재하던 튜플에 덮어씌울 수는 없다
print(new_tuple) #(1, 2, 3, 4, 5, 6, 7, 8)
존재하던 튜플에 요소를 추가하고 싶다면
해당 요소를 가진 튜플을 활용해 두 개 이상의 튜플의 요소를 포함한 새로운 튜플을 생성할 수 있다.
3. 반복 (Repetition): 튜플 곱하기
new_tuple = my_tuple * 2
#my_tuple = my_tuple * 2 #마찬가지로 존재하던 튜플에 덮어씌울 수 없다
print(new_tuple) #(1, 2, 3, 4, 5, 1, 2, 3, 4, 5)
튜플의 요소를 반복하기 위해 곱하기를 사용하여 n번 반복되는 새로운 튜플을 생성할 수 있다.
'프로그래밍 언어 > Python' 카테고리의 다른 글
파이썬의 기본 정렬 및 커스텀 정렬 (0) | 2024.08.30 |
---|---|
파이썬에서 우선순위 큐(Priority Queue)를 구현하는 방법 (0) | 2024.08.27 |
파이썬에서 큐(Queue)를 구현하는 방법 (2) | 2024.07.18 |