튜플(Tuple)은 리스트와 마찬가지로 여러 개의 값을 저장하는 자료형 중 하나이다. 하지만 리스트와는 다르게 값의 추가, 수정, 삭제 등이 불가능하며, 불변(immutable)한 특성을 가지고 있다.
튜플은 괄호()로 묶어서 표현하며, 각 값들은 쉼표(,)로 구분한다. (1, 2, 3)과 같이 표현할 수 있다.
튜플은 리스트와 마찬가지로 여러 가지 방법으로 활용할 수 있다. 예를 들어, 다음과 같은 코드를 통해 튜플을 생성하고, 값을 접근할 수 있다.
my_tuple = (1, 2, 3)
print(my_tuple[0]) # 1
my_tuple = (1, 2, 3)
my_tuple[0] = 4 # TypeError 발생
하지만 값을 읽는 것은 가능하다. 또한, 다음과 같이 여러 개의 변수에 동시에 값을 할당하는 것도 가능하다.
my_tuple = (1, 2, 3)
a, b, c = my_tuple
print(a) # 1
print(b) # 2
print(c) # 3
# 튜플 예시 코드
my_tuple = (1, 2, 3)
print(my_tuple[0]) # 1
my_tuple[0] = 4 # TypeError 발생
# 리스트 예시 코드
my_list = [1, 2, 3]
print(my_list[0]) # 1
my_list[0] = 4
print(my_list) # [4, 2, 3]
튜플과 리스트는 서로 변환이 가능하다.
튜플을 리스트로 변환하기 위해서는 list() 함수를 사용한다.
my_tuple = (1, 2, 3)
my_list = list(my_tuple)
print(my_list) # 출력 결과: [1, 2, 3]
my_list = [1, 2, 3]
my_tuple = tuple(my_list)
print(my_tuple) # 출력 결과: (1, 2, 3)
튜플은 선언 후에 내부 아이템을 변경할 수 없다. 하지만 리스트는 내부 아이템을 변경할 수 있다. 따라서 데이터의 변경이 필요하지 않은 경우에는 튜플을 사용하는 것이 좋다. 또한 리스트는 동적으로 크기를 조절할 수 있기 때문에, 크기가 변하는 데이터를 다루는 경우에는 리스트를 사용하는 것이 좋다.
튜플에서 in, not in 연산자는 해당 값이 튜플 안에 있는지 없는지를 검사한다.
# in 연산자 예제
my_tuple = (1, 2, 3, 4, 5)
print(3 in my_tuple) # True
print(6 in my_tuple) # False
# not in 연산자 예제
my_tuple = ('apple', 'banana', 'orange')
print('apple' not in my_tuple) # False
print('grape' not in my_tuple) # True
# 튜플 생성
my_tuple = (1, 2, 3, 4, 5, 3)
# count() 함수를 이용한 아이템 개수 세기
count_3 = my_tuple.count(3)
print("튜플에서 3의 개수:", count_3) # 2
# len() 함수를 이용한 튜플 전체 아이템 개수 세기
length = len(my_tuple)
print("튜플 전체 아이템 개수:", length) # 6
my_tuple = (1, 2, 3, 4, 5)
new_tuple = my_tuple[1:4]
print(new_tuple)
my_tuple = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
my_slice = my_tuple[1:5]
print(my_slice) # (2, 3, 4, 5)
my_slice = my_tuple[1:9:2]
print(my_slice) # (2, 4, 6, 8)
튜플의 슬라이싱은 리스트와 마찬가지로 인덱스를 이용하여 범위를 지정한다. 튜플 슬라이싱에서 주의해야 할 점은, 슬라이싱의 결과는 항상 새로운 튜플 객체가 반환된다는 것이다. 즉, 원본 튜플은 변경되지 않는다.
튜플 슬라이싱을 이용하여, 튜플의 일부분만 추출하거나, 역순으로 정렬된 튜플을 얻을 수 있다.
튜플은 수정이 불가능한 자료형이므로, 원본 튜플을 정렬할 수는 없다. 하지만 sorted() 함수를 사용하여 정렬된 새로운 리스트를 반환할 수 있다. sorted() 함수는 튜플 뿐만 아니라 모든 iterable한 객체에 사용할 수 있다.
tup = (3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5)
sorted_tup = sorted(tup)
print(sorted_tup)
# [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]
# 내림차순으로 정렬하려면 sorted() 함수의 reverse 매개변수를 True로 지정하면 된다.
reverse_tup = sorted(tup, reverse=True)
print(reverse_tup)
# [9, 6, 5, 5, 5, 4, 3, 3, 2, 1, 1]
딕셔너리(Dictionary)는 Key와 Value가 쌍으로 이루어진 데이터 구조이다. Key는 중복이 불가능하고, Immutable한 자료형을 사용해야 한다. Value는 중복이 가능하며, 어떠한 데이터형도 사용 가능하다. Key를 통해 Value를 빠르게 검색할 수 있으며, 순서가 없기 때문에 인덱스로 접근할 수 없다.
딕셔너리는 중괄호 {}를 사용하여 생성하며, Key와 Value는 콜론(:)으로 구분한다. Key를 통해 Value에 접근할 수 있으며, Key가 존재하지 않으면 KeyError가 발생한다. 또한, Key가 중복되면 나중에 나온 Key에 해당하는 Value가 덮어씌워진다.
딕셔너리의 주요 메소드로는 keys(), values(), items() 등이 있다.
# 딕셔너리 생성
my_dict = {'apple': 3, 'banana': 2, 'cherry': 5}
# Key를 이용한 Value 조회
print(my_dict['apple']) # 출력값: 3
# Key를 이용한 Value 변경
my_dict['apple'] = 4
print(my_dict['apple']) # 출력값: 4
# Key와 Value 추가
my_dict['durian'] = 6
print(my_dict) # 출력값: {'apple': 4, 'banana': 2, 'cherry': 5, 'durian': 6}
# Key가 존재하지 않는 경우 KeyError 발생
# print(my_dict['grape']) # KeyError 발생
# Key가 있는지 확인하기
print('banana' in my_dict) # 출력값: True
print('grape' in my_dict) # 출력값: False
# Key와 Value 삭제하기
del my_dict['cherry']
print(my_dict) # 출력값: {'apple': 4, 'banana': 2, 'durian': 6}
# 모든 Key 조회하기
print(my_dict.keys()) # 출력값: dict_keys(['apple', 'banana', 'durian'])
# 모든 Value 조회하기
print(my_dict.values()) # 출력값: dict_values([4, 2, 6])
# 모든 Key와 Value 조회하기
print(my_dict.items()) # 출력값: dict_items([('apple', 4), ('banana', 2), ('durian', 6)])
# 딕셔너리 생성
fruits = {
'apple': 2,
'banana': 4,
'orange': 1
}
# keys() 메소드 사용
print(fruits.keys()) # 출력 결과: dict_keys(['apple', 'banana', 'orange'])
# values() 메소드 사용
print(fruits.values()) # 출력 결과: dict_values([2, 4, 1])
# items() 메소드 사용
print(fruits.items()) # 출력 결과: dict_items([('apple', 2), ('banana', 4), ('orange', 1)])
# get() 메소드 사용
print(fruits.get('apple', 0))
딕셔너리는 리스트와 달리 인덱스를 사용할 수 없지만, Key를 이용하여 빠른 검색이 가능하다는 장점이 있다. 또한, 데이터가 Key-Value 쌍으로 이루어져 있어서 가독성이 높고, 데이터의 구조와 관련된 정보들을 쉽게 파악할 수 있다는 장점이 있다.
my_dict = {'apple': 1, 'banana': 2, 'orange': 3}
print('apple' in my_dict) # True
print('melon' in my_dict) # False
my_dict = {'apple': 1, 'banana': 2, 'orange': 3}
print('apple' not in my_dict) # False
print('melon' not in my_dict) # True
my_dict = {'apple': 1, 'banana': 2, 'orange': 3}
my_dict.clear()
print(my_dict) # {}
my_dict = {'apple': 3, 'banana': 2, 'orange': 1}
3 in my_dict.values() # True
my_dict = {'apple': 2, 'banana': 3, 'orange': 4}
print(len(my_dict)) # 출력결과: 3
# 빈 딕셔너리의 경우
empty_dict = {}
print(len(empty_dict)) # 출력결과: 0