글 개요
이 포스팅에서는 파이썬 자료구조 기초내용을 정리하려고 합니다.
글 본문
자료구조
여러 개의 데이터가 묶여있는 자료형을 컨테이너 자료형이라고 하고, 이러한 컨테이너 자료형의 데이터구조를 자료구조라고 합니다. 예를들어, 파이썬에서는 학생1--> 홍길동, 학생2--->박찬호, 학생3 --->이용규, 학생4 --->박승철, 학생5--->김지은 이렇게 각각 관리했습니다. 이렇게 각각 관리하지 않고, 묶어서 관리하는게 컨테이너 자료형이라고 합니다.
다양한 자료구조
자료구조는 각각 컨테이너 자료형에 따라서 차이가 있으며, 파이썬에서는 대표적으로 컨테이너 자료형으로 리스트(List), 튜플(tuple), 딕셔너리(Dic) 셋트(Set)가 있습니다.
리스트
students = ['장난감', '자동차', '컴퓨터']
튜플
students = ('자동차', '장난감', '컴퓨터')
딕셔너리
students = {'장난감':2000, '컴퓨터':5000, '자동차':1000}
셋트
students = {'장난감','자동차', '컴퓨터'}
각각 컨테이너 자료형들은 선언하는 방법과 데이터들을 담는 방법이 다릅니다. 또한 자료형 안에 있는 데이터들을 아이템 이라고 부릅니다.
셋트는 튜플과 비슷해보이지만, 중복이 허용되지 않습니다. 리스트와 튜플은 중복이 가능합니다. 튜플은 리스트와 비슷해보이지만, 한번 데이터를 담으면, 수정과 데이터 추가가 불가능합니다.
리스트
리스트에 있는 데이터들은 조회가 가능합니다. 조회를 하는방법은 index라는 방식으로 조회를 할 수 있습니다. 첫 번째가 0번index 마지막 index는 리스트 전체 길이에서 -1만큼 접근하여 조회할 수 있습니다.
#index 0 1 2
students = ['장난감', '자동차', '컴퓨터']
print(students[0]) # 장난감
print(students[1]) # 자동차
print(studetns[2]) # 컴퓨터
print(len(students) # 리스트 전체길이 3
각 아이템 접근 하는 방법은 index로 접근할 수 있다고 했습니다. 대괄호 안에 인덱스 번호를 넣어주시면 됩니다. 만약에 index값을 벚어난다면, list index out of range 라는 에러를 만날 수 있습니다.
이러한 컨테이너 자료형들은Iterable 객체 즉, 반복이 가능한 개체라서 for문이나 while에서 사용이 가능합니다.
# 리스트안에 있는 리스트 구조
studentCnt = [[1, 19], [2, 20], [3, 22], [4, 18], [5, 21]]
for key, value in studentCnt:
print(f'key: {key}, value: {value}')
리스트안에 리스트가 있는 구조라면 위 방식으로 접근이 가능합니다.
emumerate()함수
emumerate()함수를 이용한다면, 아이템을 열거할 수 있습니다.
abc = ['a', 'b', 'c', 'd']
# 방법 1.
for i in range(len(abc)):
print(i, abc[i])
# 방법 2.
for i, k in enumerate(abc):
print(i, k)
방법 2.방식으로 한다면 리스트 아이템의 각 index값과 해당하는 아이템 값들을 가져올 수 있습니다.
append()함수
리스트에 아이템을 추가하는 방법은 append()함수를 사용하면 됩니다. append()함수는 리스트의 마지막 인덱스에 아이템을 추가합니다.
studentCnt = [[1, 19], [2, 20], [3, 22], [4, 18], [5, 21]]
studentCnt.append([6,22])
print(studentsCnt)
#[[1, 19], [2, 20], [3, 22], [4, 18], [5, 21], [6,22]]
마지막에 아이템이 추가된걸 보실 수 있습니다.
insert()함수
insert()함수는 특정 index위치에 원하는 값을 추가할 수 있습니다. 그렇다면, 기존에 위치한 index값은 어떻게 될까요? 기존에 있던 값들은 뒤로 밀리게 됩니다.
# 0 1 2 3 4
studentCnt = [[1, 19], [2, 20], [3, 22], [4, 18], [5, 21]]
studentCnt.insert(1, [2.5, 33])
print(studentsCnt)
# 0 1 2 3 4 5
#[[1, 19], [2.5,33], [2, 20], [3, 22], [4, 18], [5, 21]]
기존에 가지고 있던 리스트 값들 과 insert함수로 데이터가 추가된 뒤 리스트가 차이가 있는걸 볼 수 있습니다. 기존에 있던 index 1번자리에는 [2, 20]이 있었는데, insert(1, [2.5, 33])을 해주면서 1 index에 [2.5, 33]이 되고 기존에 있던 [2, 20]은 index가 2번이 되었습니다.
append()함수와 insert()함수는 데이터를 추가한다는 의미에서는 똑같지만, 차이점은 insert()함수는 내가 원하는 위치에 데이터를 넣을 수 있고 append()함수는 무조건 마지막 인덱스에 데이터를 추가합니다.
pop()함수
리스트에 있는 아이템 값들중 하나를 지우고 싶다면, pop()함수를 사용하면 됩니다. pop()함수는 마지막인덱스에 해당하는 값을 지우고 반환을 합니다. pop(n) n:지우고 싶은 값의 인덱스를 넣어주면됩니다.
students = ['a1', 'b1', 'c1', 'd1']
students.pop()
# d1 반환
# 전체 리스트
# ['a1', 'b1', 'c1']
pop()함수를 사용하게 되면 리스트에 있는 값을 삭제하고 앞으로 한칸씩 데이터들이 당겨집니다. pop()함수를 이용해 중간에 있는 데이터를 지우면 뒤에 있는 값들이 지워진 공간에 채워지게 됩니다.
remove()함수
remove()함수는 pop()함수처럼 리스트 원소를 지울 수 있습니다. 차이점은 remove()함수는 리스트에 있는 값을 직접 넣으 셔도 됩니다.
abc = ['a', 'b', 'c']
abc.remove('b')
# ['a', 'c']
혹시나, 리스트 안에 중복된 값들이 2개 이상이 존재한다면, remove()함수를 사용시 가장 처음으로 발견된 데이터만 지우게 됩니다. 나머지 값들을 지우기 위해서는 while문을 이용해서 지우면 됩니다.
extend()함수
extend()함수는 리스트 자료형 끼리 연결할 수 있습니다. 즉, 리스트에 또 다른 리스트를 연결(확장)할 수 있습니다.
a = ['a', 'b', 'c']
b = ['d', 'e', 'f']
a.textend(b)
print(a)
# ['a', 'b', 'c', 'd', 'e', 'f']
덧셈 연산자를 이용한 리스트연결
덧셈 연산자를 이용하면 리스트 연결을 할 수 있습니다.
a = ['a', 'b', 'c']
b = ['d', 'e', 'f']
c = a + b
print(a) # ['a', 'b', 'c']
print(c) # ['a', 'b', 'c', 'd', 'e', 'f']
덧셈 연산자를 이용하게 된다면, 새로운 리스트로 나오게 되고 extend()함수를 이용하면, a라는 변수에 있는 리스트를 확장하는 개념으로 이해하면 됩니다. 물론 덧셈 연산자를 이용해서 a에 다시 합친 결과값을 할당해주면 확장된 개념으로 사용할 수 있습니다.
reverse()함수
reverse()함수를 이용하면, 리스트 내부에 있는 아이템들 순서를 뒤집을 수 있습니다. 주의할 점은 정렬하고 reverse는
상관이 없습니다.
# 예
exampleNumber = ['홍길동', '박찬호', '손흥민']
exampleNumber.reverse()
print(exampleNumber)
# ['손흥민', '박찬호', '홍길동']
이렇게 리스트들이 뒤집어진걸 확인할 수 있습니다.
슬라이싱 slice
슬라이싱을 이용하면, 리스트에서 원하는 값들을 가져올 수 있고 리스트가 가지고 있는 아이템을 변경할 수 있습니다. [n:m] n부터 m-1까지 아이템을 가져옵니다. 예를들어 [2:4] 2<= n <4 ---> 2, 3 데이터만 가져옵니다.
abcNames = ['a', 'b', 'c', 'd', 'e', 'f']
print(abcNames[2:4])
#['c', 'd']
[n:m]에 n은 생략이 가능합니다. 만약 [:m]으로 표현한다면, 처음부터 m-1까지 가져온다는 의미입니다.
[n:m]에서 n도 생략가능하니 m도 생략이 가능합니다 [n:] 처음부터 끝까지 데이터를 가져옵니다.
또한, 문자열도 슬라이싱이 가능합니다. 슬라이싱할 때 단계도 설정할 수 있습니다.
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(numbers[::2])
print(numbers[2::3])
# [1, 3, 5, 7, 9]
# [3, 6, 9]
첫 번째는 데이터를 다 가져오되 2칸씩 건너서 데이터를 가져와주세요 의미이고 두 번째는 index가 2인 값부터 3칸씩 건너서 데이터를 가져와주세요를 의미합니다.
슬라이싱을 통한 아이템 변경
슬라이싱을 이용해서 아이템을 변경할 수 있습니다.
phoneNumber = ['1234-1234', '4567-4567', '5555-5555','6666-6666', '7777-7777']
print(phoneNumber)
phoneNumber[2:4] =['1111-1111', '2222-2222']
print(phoneNumber)
#주의
phoneNumber[2:4] = ['5678-5678']
print(phoneNumber)
# 원본
# ['1234-1234', '4567-4567', '5555-5555', '6666-6666', '7777-7777']
# [2:4] 데이터변경
# ['1234-1234', '4567-4567', '1111-1111', '2222-2222', '7777-7777']
# [2:4]변경한다 하고 하나는 변경안했을 떄
# ['1234-1234', '4567-4567', '5678-5678', '7777-7777']
이렇게 슬라이싱을 통해 데이터를 변경할 수 있습니다. 하지만, 주의할게 있는데요 슬라이싱 만큼 데이터를 변경해주지 않으면 데이터가 날라갑니다.
특정 아이템 개수 알아내기 count()
count()함수를 이용하면 특정 아이템 개수를 알아낼 수 있습니다.
names = ['유', '김', '장', '이', '유', '민']
print(names.count('유'))
# 2
count()함수를 이용하면, 리스트내 특정 아이템의 개수를 찾을 수 있습니다.
데이터를 정렬하자 sort()
리스트에 있는 아이템값들을 정렬할 수 있습니다. 오름차순 정렬, 내림차순 정렬 방식이 존재합니다.
한글 정렬은 가나다 순으로 정렬
names = ['홍길동', '박찬호', '이용규', '박승철', '김지은']
names.sort(reverse=True) reverse = True 내림차순 정렬
print(names)
names.sort(reverse= False) reverse = False 오름차순 정렬
print(names)
# 내림차순
# ['홍길동', '이용규', '박찬호', '박승철', '김지은']
# 오름차순
# ['김지은', '박승철', '박찬호', '이용규', '홍길동']
추후에 이어서 튜플 자료구조를 정리하겠습니다.
'Python' 카테고리의 다른 글
파이썬 - 다양한 함수 (0) | 2021.10.11 |
---|---|
파이썬- 함수의 이해 (0) | 2021.10.09 |
pandas - 멀티 인덱스(Multi-index) 삭제하기 (0) | 2021.09.29 |
pandas - pivot_table 이해하기 (0) | 2021.09.29 |
파이썬 - folium 시각화 2 (0) | 2021.09.29 |
댓글