TIL

TIL(20.06.17-18) - Python 기본(Python 자료형 - List & Tuple)

sincerely10 2020. 6. 18. 15:02
반응형

Python로 이루어진 Django를 학습하고 따라 하면서 기본이 너무나도 중요하다는 것을 다시 느꼈습니다.
분명히 python을 어느 정도 다룰 수 있고, 기본은 되어 있다고 생각했는데 다소 간단한 기능이라도 스스로 구현해야 하는 부분이 있으면 응용이 마음대로 되질 않았습니다.

그래서 필요하고 생각날 때마다, 기본이 되는 내용을 기록하고자 합니다.
(이미 알고 있다고 생각하는 것도, 정리해서 온전히 자신의 것이 되게끔)
기본은 중요한 것이지, 쉬운 개념은 아니라고 생각합니다.

6월 17일 18일에 학습한 내용은 Python에서 제공하는 자료구조입니다.

 1. list(순서가 있는 자료형)

list라는 단어에서부터 용도를 유추하기가 쉽습니다.
주로 배열과 같은 형태로 사용하였고, 알고리즘 문제를 풀 때 많이 활용하는 자료구조 중 하나입니다.

1. 1 생성

선언과 type을 확인하면 다음과 같습니다.

>>> list= [1,2,3,4,5]
>>> list
[1, 2, 3, 4, 5]
>>> type(list)
<class 'list'>

list라는 변수에 [] 사이에 인자를 로 구분 지어주면 됩니다.
type의 확인은 type 함수로 확인이 가능합니다.

그 외에 아래와 같이 다양한 생성 방법이 있습니다.

# range로 특정구간 생성
>>> list(range(10,20))
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

# 특정횟수 반복하여 생성
>>> list= [1,2,3]
>>> list*3
[1, 2, 3, 1, 2, 3, 1, 2, 3]

# 합친 형태로 생성
>>> list= [1,2,3] + [4,5,6]
>>> list
[1, 2, 3, 4, 5, 6]

 

1.2 indexing

순서가 있는 List의 특징은 index(색인)으로 접근이 가능하다는 것입니다.
python에서 사용되는 특이한 점은 - 값으로 접근이 가능하다는 것입니다.

# indexing(일반적인 경우)
>>> list = [1, 2, 3]
>>> list[1]
>>> 2

# - 값으로 indexing
>>> list[-2]
>>> 2

- 로 접근했을 때는 맨뒤의 index의 번호가 0이 아닌 -1부터 시작한다는 것이 특징입니다.

1.3 주요 Method

list를 활용할 때, 가장 잘 활용되는 것이 제공해주는 method를 활용하는 것입니다.
사용하려는 method의 목록을 보려면 다음과 같은 명령어를 확인합니다.

>>> dir(list)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', \
'__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', \
'__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', \
'__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', \
'__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', \
'__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', \
'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

모든 Method를 활용하는 것은 아닙니다.
특히, __로 감싸진 것은 활용할 일이 거의 없을 것입니다.

1.3.1 List의 append

append 기능은 list의 가장 끝에 원소를 추가할 수 있습니다.
당연히 list의 size와 해당 객체가 점유하는 메모리도 증가할 것입니다.

>>> set.difference(set2)
{1, 2}
>>> list = [1, 2,3]
>>> list.append(6)
>>> list
[1, 2, 3, 6]

1.3.2 List의 pop

pop은 append와 반대로 list의 가장 끝에 있는 원소를 하나 제거합니다.
마찬가지로 list 객체에 변화를 줍니다.
그리고 return 값이 있다는 것이 큰 특징입니다. 변수로 받아서 그 값을 활용하는 일이 많았습니다.

>>> list
[1, 2, 3, 6]
>>> list.pop()
6
>>> list
[1, 2, 3]
>>> popped_int = list.pop()
>>> popped_int
3

1.3.3 List의 count

count method는 특정 원소의 개수를 반환합니다.
if나 반복문을 사용하지 않고 해당하는 원소의 개수를 셀 수 있는 것이 장점입니다.

>>> list = [1,2,5,4,2,1,5,3]
>>> list
[1, 2, 5, 4, 2, 1, 5, 3]
>>> list.count(1)
2
>>> list.count(3)
1

1.3.4 그 외의 Method

그 외에도 다양한 Method가 있습니다. 간략하게 설명을 하면,

sort: list를 정렬
reverse: list를 거꾸로 뒤집은 형태(역순 정렬은 아님)
clear: list를 전부 비움
extend: 다른 객체 붙여서 연장
index: 특정 value의 index를 반환, 중복인 게 있다면 가장 앞 순서의 index를 반환해준다.
remove: 특정 value의 원소를 제거, index와 비슷하게 가장 앞 순서의 원소 하나만 제거한다.
insert: 두 개의 argument가 필요합니다. 첫 번째는 index가 자리할 위치, 두 번째는 해당 index에 넣을 value입니다.
글로는 복잡해서 간단한 예제를 적으면 아래와 같습니다.

>>> list
[5, 3, 3, 3, 5, 2, 4, 5, 2]
>>> list.insert(3,1)
>>> list
[5, 3, 3, 1, 3, 5, 2, 4, 5, 2]

 

 2. Tuple(순서가 있는 자료형 & 선언 후 불변 형태)

개요

tuple이라는 단어는 사실 생소했습니다. 다시 한번 보면서 '이런 자료형이구나' 하고 보게 되었습니다. Tuple은 List와 거의 동일한 자료형입니다. 결정적인 차이는 생성 후 값을 변경할 수 없다는 것입니다.

1. 1 생성

선언과 type을 확인하면 다음과 같습니다.

>>> tuple = (1,2,3,4,5)
>>> tuple
(1, 2, 3, 4, 5)
>>> type(tuple)
<class 'tuple'>

1.2 List와의 차이점

위 개요에서 언급한 것처럼 생성 후 값을 변경할 수가 없습니다. 이를 직접 확인해보았습니다.

# Indexing
>>> tuple[1]
2

# 각자 선언 후 기존 tuple에 값 저장
>>> tuple1 = (1,2,3,4)
>>> tuple2 = (4,5,6,7)
>>> tuple2 = tuple1 + tuple2
>>> tuple2
(1, 2, 3, 4, 4, 5, 6, 7)

# 선언된 값을 변경하려 할 때 -> Error
>>> tuple2[3] = 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment


>>> dir(tuple)
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', \
'__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', \
'__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__',\
'__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', \
'__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', \
'count', 'index']

우선 indexing으로 접근하는 것은 가능했습니다.
이어서 각자를 선언하고 합친 값을 저장하는 것도 가능했습니다.(두 번째 단락)

그러나 특정 index의 값만을 변경하고자 할 때, 아이템을 할당할 수 없다는 에러를 나타냅니다.(세 번째 단락)
이어서 tuple에서 사용할 수 있는 Method를 검색했을 때, List와 같이 객체를 변경시키는 append, pop, insert 등이 전혀 없습니다.
대신 조회할 수 있는 count와 index만 가능함을 볼 수 있습니다.

즉, 기존 객체를 새로 선언하지 않으면 변경이 불가능한 형태입니다.

여기까지가 list와 tuple의 자료형에 대한 학습이었습니다.
알고리즘 문제를 해결할 때, 당연한듯이 사용한 것이지만 자세히 보니 차이점이나 각 용도에 맞게 활용된다는 것이 더 와 닿았습니다.

반응형