이전 포스트에선 빅데이터 분석을 하며 눈에 익었던 Python Type이 무엇이 있는지와 그중 하나인 Scalar에 대해 간략하게 알아보았다. 이번 포스트에서는 list에 대해 이야기해보자.
list
# list는 Data를 담는 가장 기본적인 상자라고 생각하자
# list는 다음과 같은 방법으로 만들 수 있다.
# 1. [] 사용하기
>>> list1 = [1, 2, 3, 4, 5, 6, 7]
>>> print(list1)
[1, 2, 3, 4, 5, 6, 7]
# 2. list() 함수 사용하기
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
- list는 파이썬에서 가장 일반적인 데이터를 담는 type이다.
- scalar(int, float, None, Boolean)뿐만 아니라 문자형(str)도 담을 수 있다.
- 연산에 특화된 Type이 아닌 데이터를 담는 기본 그릇이라고 생각하는 것이 이해하기 쉽다.
- list는 list() 함수, [] 안에 넣고자하는 Data를 넣어서 만들 수 있다.
Range
# range는 무엇인가?
>>> print(range(10))
range(0, 10)
# for문을 사용하여 range의 인자들을 출력해보자
>>> for i in range(10):
>>> print(i)
0
1
2
3
4
5
6
7
8
9
# range()함수는 range(시작, 끝, 간격)으로 값을 내가 원하는 때에 호출할 수 있는 함수다.
>>> [i for i in range(4, 20, 2)]
[4, 6, 8, 10, 12, 14, 16, 18]
- range() 함수는 꽤 자주 쓰이는 함수로, list와 꽤 친하니 이참에 설명하고 가겠다.
- range(시작 값, 끝 값, 간격)을 입력하여 내가 원하는 패턴을 갖는 임의의 데이터를 생성할 수 있다.
- 중요사항!) list에 data를 담는 경우, 그 data를 전부 생성해버리기 때문에 list를 생성하는 순간부터 memory를 쭉 잡아먹지만, range() 함수는 내가 원할 때, 그 값을 가지고 오기 때문에 memory 낭비가 발생하지 않는다.
- range() 함수를 출력하는 경우 range()라는 객체가 반환된다.
- 객체란? 아주 단순하게 설명해보자면, X라는 함수를 통해 무언가를 만들어냈으나, 그 결과물이 가지고 있는 정보가 매우 다양해서 한 번에 다 보는 것이 어려운 상태이다.
- 이 결과물에 특정 스위치를 붙이고 스위치를 켜주면, 그에 해당하는 정보를 볼 수 있다.
- 즉, "내가 보여줄 수 있는 것은 아주 많은데, 뭘 원해?"라고 물어보고 있는 상태라고 생각하면 쉽다.
- range() 함수로 생성된 range 객체는 당장 값이 나오지 않으며, for문과 같은 기능을 실행해주어야, 값을 반환한다.
- 내가 원할 때, 값을 가지고 온다(for문을 실행)는 것은 제네레이터(Generator)와 유사해보이지만, range()는 엄밀히 따지면 Genarator가 아니다.
- next() 함수를 이용해서 값을 꺼내면 오류가 발생한다.
- 이는 추후 제네레이터를 설명할 때 다시 언급하도록 하겠다.
- range() 함수를 출력하는 경우 range()라는 객체가 반환된다.
list의 연산
>>> a = [1,2,3,4]
>>> b = [5,6,7]
>>> print(a + b)
[1, 2, 3, 4, 5, 6, 7]
>>> print(a * b)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-20-f9c8a447c001> in <module>
----> 1 print(a*b)
TypeError: cant multiply sequence by non-int of type "list"
>>> print(a * 3)
[1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4]
- Data가 담기는 그릇인 list는 연산보다는 Data를 담는 것이 주목적이다 보니 우리가 생각하는 연산과 다른 결과가 출력된다.
- list와 list를 더 하면 두 list의 값이 합쳐지는(sum)것이 아닌 한 그릇으로 합쳐진다(extend).
- list와 list의 곱은 데이터가 담긴 두 그릇을 곱하는 것이니 연산되지 않는다.
- list에 int를 곱하면 데이터가 담긴 그릇을 그 int만큼 더 추가한다.
- 이는 list가 연산이 아닌 데이터를 담는 그릇의 성질이 더 강하다는 것을 뜻한다. 때문에 list에는 숫자형과 문자형을 함께 담을 수도 있으며, 함께 담는다고 해서 데이터의 타입이 자동으로 바뀌지 않는다.
list의 인덱싱(슬라이싱)
# 내가 원하는 위치에 있는 값을 가지고 올 수 있다.
>>> c = list(range(20))
>>> print(c[3])
3
>>> print(c[5:12])
[5, 6, 7, 8, 9, 10, 11]
# list의 안에는 다른 list를 담을수도 있다!
>>> d = [3,5,7,['a', 'p', 'p', 'l', 'e']]
>>> print(d[3])
['a', 'p', 'p', 'l', 'e']
>>> print(d[3][3:])
['l', 'e']
- Data를 담는 그릇인 list는 아주 쉽게 내가 원하는 위치에 있는 데이터를 가지고 올 수 있다.
- list[위치]를 이용하면 그 위치에 있는 값을 가지고 온다.
- Data를 담는 그릇인 list는 list 안에 list를 담을 수 있는데, 안에 있는 list를 가지고 오고 그 list 안에서 원하는 위치를 지정하면 똑같이 가져올 수 있다.
- :는 가져오려는 index의 구간을 정해줄 수 있다.
# list에서 특정 조건에 맞는 값을 가지고 오기.
>>> print(c)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
# 1. list c에서 10 이상인 값들을 가지고 와보자.
>>> c >= 10
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-36-0a29ddccf71f> in <module>
----> 1 c >= 10
TypeError: '>=' not supported between instances of 'list' and 'int'
# 2. for문과 if문을 혼용하여 가져와보자
>>> result = []
>>> for i in c:
>>> if i >= 10:
>>> result.append(i)
>>>
>>> print(result)
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
# 3. 위 코드보다 단순하게 적어보자
>>> [i for i in c if i >= 10]
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
- R이나 파이썬 numpy의 array는 c[c>=10] 처럼 단순한 코드로 조건에 해당하는 값을 가지고 올 수 있으나, list는 이 방법으로 data를 가지고 올 수 없다.
- if문을 사용하여야하며, 아직 익숙하지 않은 사람이라면 "# 2. 주석"대로 코드를 짜는 것이 쉬우며, 어느 정도 코드에 익숙해진 후에는 "# 3. 주석"의 코드 같이 짧은 코드로 짜도록 하자.
기타 리스트에서 자주 쓰이는 함수
# 1. append: list에 값 추가
>>> e = []
>>> for i in range(2, 10, 2):
>>> e.append(i)
>>>
>>> print(e)
[2, 4, 6, 8]
>>> e0 = [1,3,5]
>>> e0.append([2,4,5])
>>> print(e0)
[1, 3, 5, [2, 4, 5]]
# 2. extend: list에 다른 list의 원소들을 추가하기
>>> e.extend([1,3,5,7])
>>> print(e)
[2, 4, 6, 8, 1, 3, 5, 7]
# 3. sort: 정렬
>>> e.sort(reverse = True)
>>> print(e)
[8, 7, 6, 5, 4, 3, 2, 1]
>>> e.sort()
>>> print(e)
[1, 2, 3, 4, 5, 6, 7, 8]
# 4. insert: 삽입
>>> e.insert(2, 20)
>>> print(e)
[1, 2, 20, 3, 4, 5, 6, 7, 8]
# 5. pop: 뽑아내기
>>> e1 = e.pop(2)
>>> print(e1)
20
>>> print(e)
[1, 2, 3, 4, 5, 6, 7, 8]
# 6. remove: 가장 왼쪽에 있는 해당하는 값 제거
>>> f = [4,5,6] * 3
>>> f.remove(5)
>>> print(f)
[4, 6, 4, 5, 6, 4, 5, 6]
# 7. len: list 내 원소의 갯수 세기
>>> print(len(f))
8
# 8. count: list 내 특정 원소의 갯수 세기
>>> print(f.count(5))
2
- list.append(value)는 list에 다른 값(list도 하나의 원소로써 추가 가능!)을 추가하는 함수다.
- list.extend(list)는 list + list랑 같다
- list.sort(reverse = False)는 자주 쓰이는 함수인데, reverse는 역순으로 정렬하느냐를 의미한다. 기본적으로 reverse = False로 지정돼있으며, 이는 오름차순(작은 순)이다.
- 그냥 list의 순서를 거꾸로 하고 싶다면 list.reverse()를 쓰자
- list.insert(위치, 값) 함수를 이용하면 내가 원하는 위치에 원하는 값을 넣을 수 있다.
- list.pop(위치) 함수는 해당 위치에 있는 value를 아예 뽑아버린다!
- list.remove(값) 함수는 가장 왼쪽에 있는 해당 값만 제거하므로 모두 제거하고 싶다면 for문이나 while문으로 반복실행하자
- len(list) 함수는 list 내 원소의 수를 가지고 온다.
- len(문자) 함수는 문자의 길이를 반환한다.
- list.count(value)는 list 내 value의 개수를 가져오는 유용한 함수다.
지금까지 list type에 대해 빠르게 훑어봤는데, 파이썬의 가장 기초가 되는 Data를 담는 type이다 보니 꽤 자주 쓰이는 type이다.
위의 list 관련 함수들을 보다 보면, 분석가가 바라는 기능에 비해 조금씩 나사가 빠져있어, 원하는 결과를 내기 위해선 for문이나 while문을 섞어줘야 하는 경우가 꽤 있다.
이 것이 본문에서 "list는 Data를 담는 그릇이지, 연산을 위한 Type은 아니다"라 한 이유이기도 한데, 이후에 학습할 array, DataFrame 등은 연산이나 데이터 정리에 훨씬 특화돼있기 때문에 연산이나 Indexing 등에서 훨씬 쉽고 우월한 성능을 낸다.
이후 포스트에서 다룰 array와 DataFrame 등은 그 기능이 굉장히 다양하고, 이를 설명하려면 어지간한 전공서적만큼 설명이 필요하므로, 나머지 Type 포스팅에선 살짝 찍어만 먹어보고, 다른 카테고리인 Python-Pandas와 Python-Numpy에서 자세히 다뤄보자.
'Python > Basic' 카테고리의 다른 글
Python-기초: 1.4. 자료형(5) - dictionary (0) | 2021.01.15 |
---|---|
Python-기초: 1.3. 자료형(4) - tensor (0) | 2021.01.15 |
Python-기초: 1.2. 자료형(3) - array (0) | 2021.01.14 |
Python-기초: 1.0. 자료형(1) - scalar (0) | 2021.01.11 |
Python 파이썬이란??? (0) | 2020.06.24 |