파이썬과 리스트와 튜플 (1)
이 글의 작성자는 C/C++ 프로그래밍을 하던 사람이다. 이 글은 Python을 복습하며 작성하는 글이니, 부족한 부분이 있으면 얼마든지 피드백을 주시기 바란다.
리스트(List)와 튜플(Tuple)
지금까지 알아본 데이터 타입들(정수, 부동소수점수, 문자열 등)은 기본 데이터 타입이라고 할 수 있다. 그리고 이번에 알아볼 데이터 타입인 리스트와 튜플은 데이터들을 담아두는 역할을 수행한다. 대충 밑의 그림처럼 생겼다고 보면 된다.
리스트와 튜플의 특징
그러면 리스트와 튜플은 어떤 특징이 있는지 알아보자.
- 무엇이든지 담을 수 있다
리스트와 튜플을 소개할 때, 데이터들을 담아두는 역할을 한다고 했었다. 그렇다면 어떤 데이터를 담을 수 있을까?
결론부터 말하자면 모든 데이터를 담을 수 있다. 정수나 문자열은 물론이고, 리스트나 튜플도 담을 수 있다! 즉, 리스트 안에 리스트가 있을 수도 있고, 튜플 안에 튜플이 있을 수도 있다.
- 순서가 있다
리스트를 표현한 그림을 잠시 살펴보자. 여러 데이터들이 들어있는데, 이 데이터들은 다음과 같이 위치해 있음을 알 수 있다.
‘hello’는 왼쪽에서 두 번째에 있다. 10.0은 맨 오른쪽에 있다.
위와 같이, 어디로부터 몇 번째에 있다라고 이야기 할 수 있음을 알 수 있다. 이는 위와 같이 줄을 세워놓지 않으면 할 수 없는 일이다.
그리고 이 특징은 문자열에서 본 적이 있을 것이다.
리스트와 튜플의 차이
이렇게보면 둘은 상당히 비슷해 보이지만, 무언가 차이가 있기 때문에 굳이 구분을 하고 있을 것이다. 그러면 이 둘의 차이점은 무엇인지 알아보자.
- 가변성
리스트는 가변이고 튜플은 불변이다. 리스트에 있는 데이터는 수정, 추가, 제거가 가능하지만, 튜플은 불가능하다. 한 번 데이터들을 담았으면 끝까지 그 데이터들을 안고 가야 한다.
주요한 차이점은 이거 하나 뿐이다. 하지만 이 하나의 차이점 때문에 추가로 발생하는 차이점들이 있다.
아래의 내용은 지금 이해하고 넘어갈 필요는 없다. 아마 대부분 처음 보는 용어들이 튀어나올 것이다. 지금은 그냥 가변성 하나가 만들어낸 차이점들을 감상하고 넘어가자.
- 리스트는 hash가 안되지만, 튜플은 가능하다.
- 튜플이 메모리를 덜 사용한다.
- 튜플이 순회하는 속도가 더 빠르다.
리스트/튜플 맛보기
그러면 본격적으로 리스트와 튜플을 찍어 먹어보자. 리스트와 튜플의 사용법은 비슷하다. 리스트에선 가능하나 튜플에선 불가능한 동작은 따로 표시하도록 하겠다.
생성하기
리스트는 이렇게 만들 수 있다.
>>> a = list()
>>> a
[]
>>> a = [1,2,3,4]
>>> a
[1, 2, 3, 4]
list()로 비어있는 리스트를 만들 수도 있고, [1, 2, 3, 4]처럼 대괄호 안에 미리 데이터들을 집어넣어서 만들 수도 있다. 단순히 a = []
처럼 대괄호 안에 아무것도 넣지 않으면 a = list()
와 같은 결과, 비어있는 리스트, 를 얻게 된다.
튜플도 비슷하다.
>>> a = tuple()
>>> a
()
>>> a = (1,2,3,4)
>>> a
(1, 2, 3, 4)
tuple()로 비어있는 튜플을 만들 수도 있고, (1, 2, 3, 4)처럼 괄호 안에 미리 데이터를 집어넣어서 만들 수도 있다. a = ()
로 비어있는 튜플을 만들 수도 있다.
list()나 tuple()의 괄호 안에 리스트나 튜플을 집어넣으면 리스트/튜플로 데이터의 형태를 바꿀 수도 있다.
>>> a = [1,2,3,4]
>>> b = tuple(a)
>>> b
(1, 2, 3, 4)
심지어는 문자열을 집어넣어도 된다.
>>> a = list('hello')
>>> a
['h', 'e', 'l', 'l', 'o']
>>> b = tuple('hello')
>>> b
('h', 'e', 'l', 'l', 'o')
이를 한마디로 표현하자면, 순회 가능한 객체를 인자로 받는다고 이야기한다.
데이터 가져오기
문자열에서 하던 것 처럼 하면 된다. 완전히 똑같으므로 확인만 해 보도록 하자.
>>> a = (1,2,3,4,5)
>>> a[2:4]
(3, 4)
>>>
>>>
>>> a = [1,2,3,4]
>>> a[2]
3
>>> a[:2]
[1, 2]
>>> a[-1]
4
>>> a = (1,2,3,4)
>>> a[2]
3
>>> a[:2]
(1, 2)
>>> a[-1]
4
리스트/튜플 안의 리스트/튜플
특징을 이야기할 때, 리스트/튜플 안에 리스트/튜플 도 들어갈 수 있다고 이야기한 바 있다. 그러면 리스트/튜플 안의 리스트/튜플의 특정 데이터는 어떻게 가져오면 될까? 다음과 같은 리스트가 있다고 가정해보자.
>>> a = [[1,2,3],[4,5,6],[7,8,9]]
그러면 여기서 a의 0번째 인덱스, 즉 a[0]
은 어떤 리스트를 가리키고 있을까? [1,2,3]
을 담은 리스트를 가리키고 있다. 즉, a[0]은 [1,2,3]
이다.
그러면 a[0]의 0번째 인덱스는 어떻게 표현해야 할까? 그냥 a[0][0]
으로 표현하면 된다. 그러면 [1,2,3]
리스트의 0번째 인덱스 데이터인 0
을 가져오게 될 것이다.
정리하자만, 위의 리스트에서 각각의 값은 다음과 같이 표현할 수 있다.
데이터 존재여부 확인하기
a라는 리스트/튜플 안에 특정 데이터가 있는지 확인해보고 싶을 때가 있다. 이럴 때 사용할 수 있는 기능으로 in
이라는 것이 존재한다.
상자 안에 연필을 영어로 표현하면 pencil in box이다.
A 안에 B를 영어로 표현하면 B in A이다.
즉, 리스트/튜플 a 안에 정수형 데이터 3이 있는지 확인해보고 싶다면 다음과 같이 표현하면 된다.
>>> a = [1,2,3]
>>> 3 in a
True
>>> 5 in a
False
결과가 나오는데, True
랑 False
가 나오고 있다. True
는 참이라는 뜻으로, a 안에 3이 있다는 뜻이다. False
는 거짓이라는 뜻으로, a 안에 5가 없다는 뜻이다.
그러면 True
와 False
는 어떤 데이터일까?
불
(부울 로도 불리기도 한다) 데이터 타입이다. Boolean 단어의 앞에 4글자를 따서 만들어진 용어이다. 사실 True
와 False
만 표현하는 데이터 타입이라 따로 말할 건 없지만, 나중에 이 데이터 타입을 쓰는 일이 생기면 그 때 같이 설명하도록 한다.
리스트의 항목 수정/추가/제거하기
튜플은 불변이므로, 이 동작은 튜플에선 불가능한 동작임을 미리 알려둔다. 리스트는 가변이므로, 리스트의 항목을 수정하거나 추가, 제거할 수 있다.
- 수정하기
간단하다. 수정하고자 하는 리스트의 인덱스에 새로운 데이터를 대입해주면 된다.
>>> a = [1,2,3]
>>> a[1] = 9
>>> a
[1, 9, 3]
- 추가하기
리스트에 데이터를 추가하고 싶다고 존재하지 않는 인덱스에 데이터를 대입하면 안된다. 리스트의 특별한 기능을 사용해야 한다.
먼저 append에 대해 알아보자. append는 리스트의 맨 마지막에 데이터를 추가하는 리스트의 기능이다.
append의 사용법은 다음과 같다.
list.append(data)
list
는 데이터를 집어넣을 리스트의 이름을 쓰면 된다.
data
는 집어넣고자 하는 데이터의 이름을 쓰면 된다.
>>> a = [1,2,3]
>>> a.append(4)
>>> a
[1, 2, 3, 4]
그 다음으로 알아볼 기능은 insert다. insert는 리스트의 원하는 곳에 데이터를 추가하는 리스트의 기능이다.
insert의 사용법은 다음과 같다.
list.insert(index, data)
list
는 데이터를 집어넣을 리스트의 이름을 쓰면 된다.
index
는 집어넣고 싶은 데이터의 인덱스 값을 집어넣으면 된다.
data
는 집어넣고자 하는 데이터의 이름을 쓰면 된다.
>>> a = [1,2,3]
>>> a.insert(1,9)
>>> a
[1, 9, 2, 3]
위에서 볼 수 있듯이, 원래 있던 데이터들은 하나씩 뒤로 밀리게 된다.
- 제거하기
del
을 이용하여 리스트에 들어있는 데이터를 지울 수 있다.
>>> a = [1,2,3,4]
>>> del a[1]
>>> a
[1, 3, 4]
리스트의 맨 뒤의 데이터를 지우고 싶다면 del[-1]
을 써도 되지만, pop()이라는 리스트가 지원하는 기능을 사용해도 된다.
>>> a = [1,2,3,4]
>>> a.pop()
4
>>> a
[1, 2, 3]
위의 예시를 보면 a.pop()
을 실행한 뒤 4
가 출력된 것을 확인할 수 있을 것이다. 특이하게도 pop()은 리스트로부터 지워진 값을 돌려주는 특성을 가지고 있다.
나중에 이 특성을 잘 써먹을 날이 올 것이다.
Comments