프로그래밍을 하면서 과연 얼마나 많은 양의 데이터들을 다루게 될까...? 그리고 그때 과연 우리는 변수 하나에 하나의 데이터만을 저장하는 방식으로 처리해 낼 수 있을까...?
다들 알겠지만 그럴 순 없다!
변수 하나에는 하나의 메모리 공간을 차지하기 때문에, 메모리적으로도, 우리가 코딩을 하기에도, 버겁다...!
그래서 존재하는 것이 리스트(LIST)이다..!
리스트를 더 잘 사용할 수 있게 도와주는 내장 함수들이 파이썬이 많이 지원하기에 데이터 분석 분야에서 파이썬을 많이들 사용한다고들 한다. 차근차근 알아가보자..!
리스트
리스트는 다시 말하면 배열이다. 배열은 데이터들을 한 곳에 모아둔 것이라고 보면 될 것같다.
numbers = [2, 3, 4, 5, 6, 7]
strings = ["윤수", "영훈", "태훈"]
print(numbers) # [2, 3, 4, 5, 6, 7]
print(strings) # ["윤수", "영훈", "태훈"]
리스트에 같은 타입의 자료형만 와야 하는 것은 아니다. 파이썬에서 지원하는 자료형이라면 다 들어올 수 있다.
1. 인덱싱
그러면 우리는 리스트에서 어떻게 원하는 값을 가져올 수 있을까?
인덱스를 배열에 적용시켜서 값을 가져올 수 있다.
numbers = [2, 3, 4, 5, 6]
Data | 2 | 3 | 4 | 5 | 6 |
Index | 0 | 1 | 2 | 3 | 4 |
리스트에는 첫 번째 데이터에 인덱스가 0이 붙는다.
이는 다른 프로그램언어에서도 동일하다!!
인덱싱을 하면, 리스트의 요소를 하나의 변수로서 사용할 수 있다.
numbers = [2, 3, 4, 5, 6]
num1 = numbers[0]
num2 = numbers[1]
numbers[0] 이라는 리스트의 요소가 num1에 할당될 수 있다.
numbers[0]이 사실은 변수와 동일하다. 값을 추상화시키기 때문이다.
단지 네이밍을 이해하기 쉽게 바꿔주는 것 뿐이다.
만약에... 부여되지 않은 인덱스를 호출하면 어떻게 될까?
numbers = [2, 3 , 4 , 5 , 6 , 7]
numbers[10]
#Traceback (most recent call last): File "main.py", line 2, in <module> numbers[10]
#IndexError: list index out of range
IndexError를 발생시킨다.
***리버스 인덱싱
파이썬에서는 인덱스를 헤드에서부터 부여하는 방식과, 테일에서부터 부여하는 방식 둘 다 지원한다.
Data | 1 | 2 | 3 | 4 | 5 |
Index | 0 | 1 | 2 | 3 | 4 |
ReverseIndex | -5 | -4 | -3 | -2 | -1 |
2. 리스트 슬라이싱
위에서 인덱스를 이용하면 데이터를 "하나씩" 불러올 수 있다..!
그런데 만약에 범위를 지정해서 싹 긁어오고 싶다면..?
이럴때 사용하는 것이 리스트 슬라이싱이다.
list[start_index: limit_index]
numbers = [2, 3, 4, 5]
numbers[0:4] # [2,3,4,5]
list[start_index:]
numbers = [2, 3, 4, 5]
numbers[2:] # [4, 5]
list[:limit_index]
numbers = [2, 3, 4, 5]
numbers[:2] # [2, 3]
3. 리스트 함수
앞선 글에서 말했듯이 파이썬은 리스트 내장 함수를 많이 지원해준다.
1) CRUD 함수
len([target_list])
- len 함수는 리스트 요소의 개수를 원할 때 사용한다. (리스트의 길이를 구한다 라고 표현한다)
numbers = [1,2,3,4]
#len은 리스트의 길이를 구할 때 사용
print(len(numbers)) # 4
append(target_data)
- append 함수는 이름 그대로 리스트에 값을 추가하고 싶을 때 사용한다.
numbers = [1,2,3,4]
# append로 값을 추가하면, 가장 끝 인덱스에 값을 넣는다
numbers.append(5) # numbers = [1,2,3,4,5]
extend([target_data])
- extend 함수는 append 함수와 유사한데, 리스트에 여러 값을 한 번에 넣고싶고, 중복 리스트를 원하지 않을 때 사용한다.
numbers = [1, 2, 3, 4]
numbers.extend([5, 6, 7, 8]) # numbers = [1,2,3,4,5,6,7,8]
# list로 파라미터를 전달하지만, 최종적으로는 데이터들만 들어감.
del list[target_index]
- del은 위의 함수들과 다르게 keyword다. 리스트의 값을 지우고 싶을 때 사용한다.
numbers = [1,2,3,4]
del numbers[2]
print(numbers) # [1, 2, 4]
insert(target_index, target_data)
- insert 함수는 원하는 위치에 원하는 값을 넣고싶을 때 사용한다.
numbers = [1,2,3,4]
numbers.insert(4, 5)
print(numbers) #[1,2,3,4,5]
함수에 대한 설명을 알고 싶을 때! help()를 이용한다.
예를들어, insert 함수에 대한 설명을 보고 싶으면,
help(list.insert)
Help on method_descriptor: insert(self, index, object, /) Insert object before index.
이런 식으로 함수에 대한 설명이 나온다.
2) 정렬
sorted(target_list, reverse = False)
- 원본 배열을 해치지 않고, return값으로 정렬된 리스트를 반환함.
numbers = [19, 13, 2, 4, 5, 7, 3]
# reverse 파라미터를 넣지 않으면, 기본값은 false! 옵셔널 파라미터이다.
new_list = sorted(numbers) #오름차순
# reverse 파라미터를 넣으면 내림차순이다.
new_list = sorted(numbers, reverse = True) # 내림차순
target_list.sort(reverse = False)
- 아무 값도 return하지 않고, target_list의 값을 정렬 값으로 치환한다.
numbers = [19, 13, 2, 4, 5, 7, 3]
numbers.sort() # 오름차순
numbers.sort(reverse = True) # 내림차순
sorted() vs list.sort()
sorted()는 list를 파라미터로 받아서, temp 리스트에 값을 저장하고, 그 temp 리스트를 정렬 후 temp 리스트를 리턴
sort()는 list 자체의 값을 인덱스를 이용해서 크기를 비교한 후 값을 정렬시켜버린다.
# 원본 리스트를 보존하려면 sorted() 사용 // 원본 리스트를 변경하려면 list.sort() 사용
3) 값 찾기
만약 값을 찾는 내장 함수를 지원하지 않았다면 어떻게 구현할 수 있을까?
## value가 some_list의 요소인지 확인
def find_(some_list, value):
i = 0
while i < len(some_list):
if some_list[i] == value:
return True
i += 1
return False
그리 어렵지는 않았다! 그런데, 매번 이렇게 구현하기에는 코드 양이 생각보다 길지 않나 싶은데!
그래서 파이썬에서 조회함수는 자주 쓰이므로 내장함수를 지원한다! (감사합니다)
data in list
data not in list
primes = [2, 3, 5, 7, 11, 13, 17, 19, 23]
# 값이 primes 안에 있는지 확인
print(7 in primes) # True
print(12 in primes) # False
#값이 없는지 확인하려면 in 앞에 not을 써준다.
primes = [2, 3, 5, 7, 11, 13, 17, 19, 23]
print(7 not in primes) # False
print(12 not in primes) # True
4) 기타
Nested_List[row][col]
- 리스트 내부에는 또 다른 리스트가 존재할 수 있다. 보통 행열 개념을 프로그램에 적용할 때 자주 사용한다.
# 3X3 행열
grades = [[62, 75, 77], [78, 81, 86], [85, 91, 89]]
# 1행의 데이터
print(grades[0])
# 3행의 데이터
print(grades[2])
# 1행 1열의 데이터
print(grades[0][0])
# 3행 2열의 데이터
print(grades[2][1])
some_list.reverse()
- some_list의 원소들을 뒤집어진 순서, 즉 인덱스 0 ~ n 을 -1 ~ -(n+1)에 일대일 대응시킨다.
numbers = [5, 3, 7, 1]
numbers.reverse()
print(numbers) #[1, 7, 3, 5]
some_list.index(target_data)
- some_list에 target_data의 값을 갖고 있는 원소의 인덱스를 반환한다.
members = ["영훈", "윤수", "태호", "혜린"]
print(members.index("윤수")) # 1
print(members.index("태호")) # 2
some_list.remove(target_data)
- some_list에서 첫 번째로 target_data의 값을 갖고 있는 원소를 삭제해준다.
fruits = ["딸기", "당근", "파인애플", "참외","파인애플"]
fruits.remove("파인애플")
print(fruits) # ['딸기', '당근', '참외', '파인애플']
튜플
튜플은 리스트와 몇 가지 다른 점을 제외하고는 거의 비슷하다.
- 튜플은 ( ) 로 값을 감싸준다
- 튜플은 삭제와 수정이 불가능하다.
1. 값을 삭제하거나 수정하려고 할 때
...
TypeError: 'tuple' object doesn't support item deletion
...
TypeError: 'tuple' object does not support item assignment
라면서 혼난다..
튜플은 리스트와 비슷해서 슬라이싱, 인덱싱, 더하기, 곱하기, 길이구하기 등이 가능하다.
변수 여러개에 값 한 줄에 할당하기
a, b, c = (10, 20, 30) man, wate, grap = 'yello', 'green', 'purple'
요즘 들어서 근무가 계속 개인정비 시간에 잡혀있다... 너무 슬프다... 공부할 시간이 너무 부족해!
일단 OS랑 CN 그리고 토익책도 샀으니..! 밤에 연등해서 사지방 안달려가도 도서관 달려가면 되니까..!
신난다 할게 생겼다~!
조금만 더 시간 내고 분배 잘해서 원하는 결과 이루었으면 좋겠다!
2021-09-10
'Language > Python' 카테고리의 다른 글
6. 파이썬 딕셔너리 (0) | 2021.09.12 |
---|---|
5. 파이썬 for 문 (0) | 2021.09.12 |
3. 파이썬 제어문 (0) | 2021.09.07 |
2. 파이썬 추상화 (0) | 2021.09.06 |
1. 파이썬 자료형 (2) | 2021.09.05 |