ROS/Python

Advanced Python(2) - Tuples

luke12 2022. 7. 29. 17:51

https://youtu.be/Kes8YRV73Io

위의 동영상을 한국어로 번역하여 정리해보려고 한다.


튜플은 순서가 있고 불변하는 객체의 집합입니다. 튜플은 리스트과 유사하며, 주요 차이점은 불변성입니다. 파이썬에서 튜플은 소괄호와 쉼표로 구분된 값으로 작성됩니다.

my_tuple = ("Max", 28, "New York")

리스트가 아닌 튜플을 사용해야 하는 이유들

  • 일반적으로 함께 속하는 개체에 사용
  • 이기종(다른) 데이터 유형에는 튜플을 사용하고 동종(같은) 데이터 유형에는 리스트를 사용
  • 튜플은 불변이므로 튜플을 통해 반복하는 속도가 리스트보다 약간 빠릅니다.
  • 불변 요소가 있는 튜플은 딕셔너리의 키로 사용할 수 있습니다. 리스트에서는 이 작업을 수행할 수 없습니다.
  • 변경되지 않은 데이터가 있는 경우 튜플로 구현하면 쓰기 보호가 유지

튜플 만들기

튜플은 소괄호 및 쉼표로 구분된 값으로 작성됩니다. 또는 내장된 튜플 함수 기능을 사용합니다.

tuple_1 = ("Max", 28, "New York")
tuple_2 = "Linda", 25, "Miami" # 괄호는 선택 사항

# 특수한 경우: 요소가 하나만 있는 튜플은 끝에 쉼표가 있어야 합니다.
# 그렇지 않으면 튜플로 인식되지 않습니다.
tuple_3 = (25,)
print(tuple_1)
print(tuple_2)
print(tuple_3)

# 또는 내장된 튜플 함수를 사용하여 리스트, 딕셔너리, 문자열을 변환합니다.
tuple_4 = tuple([1,2,3])
print(tuple_4)

---------------------------
('Max', 28, 'New York')
('Linda', 25, 'Miami')
(25,)
(1, 2, 3)

요소에 접근

인덱스 번호를 참조하여 튜플 항목에 접근합니다. 지수는 0에서 시작합니다.

item = tuple_1[0]
print(item)
# 음의 인덱싱을 사용할 수도 있습니다. 예: -1은 마지막 항목을 나타냅니다.
# -2는 2번째 마지막 항목, 그리고 계속
item = tuple_1[-1]
print(item)

--------------------------
Max
New York

항목을 추가하거나 변경

가능하지 않고, 타입에러가 발생한다.

tuple_1[2] = "Boston"

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-5-c391d8981369> in <module>
----> 1 tuple_1[2] = "Boston"

TypeError: 'tuple' object does not support item assignment

튜플 삭제

del tuple_2

반복

#  for in loop을 사용하여 튜플을 반복하여 출력
for i in tuple_1:
    print(i)
    
-------------------------------------
Max
28
New York

항목이 존재하는지 확인

if "New York" in tuple_1:
    print("yes")
else:
    print("no")

----------------------------
yes

유용한 방법들

my_tuple = ('a','p','p','l','e',)

# len() : 튜플에서 요소의 갯수 가져오기
print(len(my_tuple))

# count(x) : x와 동일한 항목 수를 반환
print(my_tuple.count('p'))

# index(x) : x와 동일한 첫 번째 항목의 인덱스를 반환
print(my_tuple.index('l'))

# 반복
my_tuple = ('a', 'b') * 5
print(my_tuple)

# 연결
my_tuple = (1,2,3) + (4,5,6)
print(my_tuple)

# 리스트를 튜플로 변환
my_list = ['a', 'b', 'c', 'd']
list_to_tuple = tuple(my_list)
print(list_to_tuple)

tuple_to_list = list(list_to_tuple)
print(tuple_to_list)

# 문자열을 튜플로 변환
string_to_tuple = tuple('Hello')
print(string_to_tuple)

---------------------------------------------
5
2
3
('a', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a', 'b')
(1, 2, 3, 4, 5, 6)
('a', 'b', 'c', 'd')
['a', 'b', 'c', 'd']
('H', 'e', 'l', 'l', 'o')

슬라이싱

문자열과 마찬가지로 콜론(:)을 사용하여 튜플의 하위 부분에 접근

# a[start:stop:step], 기본 스텝은 1
a = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
b = a[1:3] # 마지막 인덱스는 포함되지 않습니다.
print(b)
b = a[2:] # 끝까지
print(b)
b = a[:3] # 처음부터
print(b)
b = a[::2] # 처음부터 끝까지 2스텝씩
print(b)
b = a[::-1] # 반전 튜플
print(b)

------------------------------------------
(2, 3)
(3, 4, 5, 6, 7, 8, 9, 10)
(1, 2, 3)
(1, 3, 5, 7, 9)
(10, 9, 8, 7, 6, 5, 4, 3, 2, 1)

튜플 안에 내용 풀기

# 변수 개수는 튜플 요소의 개수와 일치해야 합니다.
tuple_1 = ("Max", 28, "New York")
name, age, city = tuple_1
print(name)
print(age)
print(city)

# 팁: *로 여러 요소를 리스트로 풀기
my_tuple = (0, 1, 2, 3, 4, 5)
item_first, *items_between, item_last = my_tuple
print(item_first)
print(items_between)
print(item_last)

-------------------------------
Max
28
New York
0
[1, 2, 3, 4]
5

중첩 튜플

튜플에는 다른 튜플(또는 다른 유형 타입)이 포함될 수 있습니다.

a = ((0, 1), ('age', 'height'))
print(a)
print(a[0])

-------------------------------
((0, 1), ('age', 'height'))
(0, 1)

튜플과 리스트를 비교

튜플의 불변성을 통해 파이썬은 내부 최적화를 수행할 수 있습니다. 따라서 튜플은 대용량 데이터로 작업할 때 더 효율적일 수 있습니다.

# compare the size
import sys
my_list = [0, 1, 2, "hello", True]
my_tuple = (0, 1, 2, "hello", True)
print(sys.getsizeof(my_list), "bytes")
print(sys.getsizeof(my_tuple), "bytes")

# compare the execution time of a list vs. tuple creation statement
import timeit
print(timeit.timeit(stmt="[0, 1, 2, 3, 4, 5]", number=1000000))
print(timeit.timeit(stmt="(0, 1, 2, 3, 4, 5)", number=1000000))

----------------------------------
104 bytes
88 bytes
0.12474981700000853
0.014836141000017733