파이썬 기초 3 자료구조

매생이·2021년 10월 16일
0

파이썬 공부

목록 보기
5/8

자료구조

자료구조란 ? 여러개의 데이터가 묶여있는 자료의 자료형을 컨테이너 자료형이라고 한다.
이러한 컨테이너 자료형의 데이터 구조를 자료구조라고 한다.

자료구조는 각각의 컨테이너 자료형에 따라서 차이가 있으며, 대표적인 컨테이너 자료형들이 있다.

  • 리스트(List) students = ["철수","짱구","훈이","유리","맹구"]
  • 튜플(Tuple) jobs = ("학생","의사","대학원생","개발자","데이터사이언티스트")
  • 딕셔너리(Dic) scores = {"DB":"A","Networking":"B+","DataMining":"A+"}
  • 셋트(Set) numbers = {1,2,3,4,5,6}

리스트

리스트는 배열과 같이 여러개의 데이터를 나열한 자료구조이다.
각각의 데이터들을 연결시켜 하나의 컨테이너에 담은 구조이다.

[]를 이용해서 선언하고, 각 데이터마다 , 를 이용해서 구분해준다.
여러 자료형의 데이터를 한번에 담을 수 있다.
또한 리스트 속에 들어가는 데이터가 리스트 자료형일 수도 있다.

리스트의 선언만큼이나 중요한게 조회 방법인데, 먼저 인덱스를 알아야한다.

인덱스 : 인덱스란 리스트같은 여러 데이터를 담은 컨테이너 자료형들에서 사용하는 데이터의 번호이다. 초등학생때부터 우리가 부여받던 출석번호가 대표적인 인덱스이며, 각 데이터들을 구분하는 고유성을 가진 숫자 혹은 명칭으로 구성된다.

인덱스를 사용해서 리스트의 데이터를 조회할 수 있는데, 리스트의 인덱스는 0부터 리스트 속의 (데이터의 갯수)-1 까지로 이루어져있다.
예를들어 2번째 데이터를 불러와서 사용하고 싶을때는 list[1] 라고 작성하면 된다.

리스트의 모든 데이터를 조회할때 앞서 다뤘던 반복문으로 모든 데이터를 조회할 수 있는데, len() 함수를 사용하면 쉽다.
for문은 횟수를 사용한 반복인데, len()함수는 인자로 넘겨준 리스트의 길이, 담겨있는 데이터의 갯수를 반환해준다.
그렇기 때문에 i = 0 for i in range(len(list)) 라는 구문을 사용하면 리스트의 데이터 갯수만큼 반복문이 반복된다.

list = ["a","b","c","d"]

i = 0
for i in range(len(list)):
	print(list[i])

실행 결과 :
a
b
c
d

또한 앞서 말했던 리스트 속의 데이터로 리스트를 갖는 형태의 리스트도 for문을 사용해서 쉽게 사용할 수 있다.

studentCnts = [[1,19],[2,20],[3,22],[4,10],[5,21]]

for classNo, cnt in studentCnts:
	print("{}반은 {}명".format(classNo,cnt))

실행 결과:
1반은 19명
2반은 20명
3반은 22명
4반은 10명
5반은 21명

이렇듯 for문은 데이터를 확인하는 등 여러 방법으로 데이터를 다루는데 필수적이고 활용도가 높다.

for문 속에 조건문을 넣어서 데이터를 필터링 하는 것도 가능하다.

students = [["철수",170],["유리",158],["짱구",178],["맹구",190],["짱아",156],["훈이",188],["치타",182]]

for student in students:
	if student[1]>180:
    	print("{}는 키가 180 이상입니다".format(student[0]))

실행 결과 :
맹구는 키가 180 이상입니다
훈이는 키가 180 이상입니다
치타는 키가 180 이상입니다

for문을 사용하였듯이, 조건을 통한 반복인 while문으로도 리스트 조회가 가능하다.
while문은 for문처럼 리스트에서 데이터를 받아오는 구문설정이 안되기 때문에, 반복문 밖에서 인덱스 변수를 선언해두고 반복문 내에서 증가시키는 방식으로 반복한다.

i = 0

students = [["철수",170],["유리",158],["짱구",178],["맹구",190],["짱아",156],["훈이",188],["치타",182]]

while(i<len(students)):
	print(students[i][0],"의 키는",students[i][1])
    i+=1

실행 결과:
철수 의 키는 170
유리 의 키는 158
짱구 의 키는 178
맹구 의 키는 190
짱아 의 키는 156
훈이 의 키는 188
치타 의 키는 182

enumerate()

위에서 나왔던 방식을 모두 아우르는 함수가 있는데 바로 enumerate이다.
인덱스 변수를 사용하여 참조하는 방식이 아닌, 데이터 자체를 받아와 사용할 수 있는데,
리스트 뿐만 아니라 문자열에도 적용할 수 있는게 큰 장점이다.

message = "넓고 넓은 바닷가에 오막살이 집 한채"

count = 0
for idx, value in enumerate(message):
if value == " ":
count+=1
print("({}) 속의 공백 개수는 {}개".format(message,count)

실행 결과 :
(넓고 넓은 바닷가에 오막살이 집 한채) 속의 공백 개수는 5개
>

### 리스트에 아이템 추가하기
`append()` 함수를 사용하면 마지막 인덱스에 아이템을 추가해줄 수 있다.

>

list = [1,2,3,4,5,6]
list.append(8)
print(list)

실행 결과 : 
[1, 2, 3, 4, 5, 6, 8]
>

그렇다면 마지막 인덱스 말고 다른 위치에는 아이템을 추가해줄 수 없을까?

`insert(index,data)` 함수를 사용하면 특정 위치(인덱스)에 아이템을 추가할 수 있다.

>

list = [1,2,3,4,5,6]
list.insert(3,10)
print(list)

실행 결과 : 
[1, 2, 3, 10, 4, 5, 6]
>

실행 결과를 보고 왜 1,2,10,3,4,5,6 이 아니지 라는 생각이 든다면, 파이썬의 인덱스는 0부터 시작한다는 사실을 다시 외워야한다.

### 리스트 아이템 삭제
리스트에 아이템을 추가했다면, 삭제하는 방법도 있다.
삭제에도 추가와 마찬가지로, 마지막 인덱스를 삭제하는 방법과, 선택해서 삭제하는 방법이 존재한다.

리스트의 아이템을 삭제하는 방법으로는 `pop()`함수가 있다.
pop() 함수에 아무런 인자를 넘겨주지 않고 사용하면 마지막 인덱스에 해당하는 아이템을 삭제한다.
또한 pop()함수에 인자로 숫자를 넘겨주면 해당 인덱스의 아이템을 삭제한다.

>

list = [1,2,3,4,5,6,7,8]
list.pop()
print(list)
list.pop(2)
print(list)

실행 결과 : 
[1, 2, 3, 4, 5, 6, 7]
[1, 2, 4, 5, 6, 7]
>

또한 특정 데이터를 삭제하는 방법은 `remove()` 함수가 또 존재한다.
remove는 pop과 다르게, 인덱스가 아닌 값 그 자체를 넘겨주어 같은 값을 삭제시키는 방법이다.
remove가 없었다면.
반복문으로 인덱스를 하나하나 검출해서 해당 인덱스의 값과 특정 값이 같은지 확인한 후 pop을 사용해야했을수도 있다.

>

list = ["a","B","c","D","e","F"]
for i in range(len(list)):
if list[i]=="D":
list.pop(i)
break
print(list)

실행 결과 : 
['a', 'B', 'c', 'e', 'F']
>

>

list = ["a","B","c","D","e","F"]
list.remove("D")
print(list)

실행 결과 : 
['a', 'B', 'c', 'e', 'F']
>

실행 결과가 같은 것을 알 수 있다.

### 리스트의 연결(확장)

리스트에 값을 넣어주는 것이 아니라 리스트와 리스트끼리를 이어줄 수도 있다.
마치 문자열을 이어붙이듯이 말이다.
`extend()` 함수를 사용하면 두 리스트를 이어붙일 수 있다.

>

list_a = ["a","b","c","d"]
list_b = ["A","B","C","D"]
list_a.extend(list_b)
print(list_a)

실행 결과 : 
['a', 'b', 'c', 'd', 'A', 'B', 'C', 'D']
>

리스트가 이어진 것을 확인할 수 있다.
그런데 문자열을 이어붙이듯이 리스트를 연결한다고 말했는데, 그렇다면 문자열처럼 `+` 를 사용해서 이어붙일 수 있을까?

>

list_a = ["a","b","c","d"]
list_b = ["A","B","C","D"]
list_a = list_a + list_b
print(list_a)

실행 결과 : 
['a', 'b', 'c', 'd', 'A', 'B', 'C', 'D']
>

덧셈 연산자로도 이어붙일 수 있다!
또한 덧셈 연산자가 되기 때문에, `+=` 도 가능하다.

### 리스트의 정렬
리스트를 정렬하는 함수이다.
quick_sort, merge_sort 등 여러 정렬방법을 구현할 수도 있지만, 차후 알고리즘 포스트에서 다루도록 하겠다.
지금은 메소드로 이미 구현되어있어 호출이 가능한 `sort()` 함수가 있다.
sort() 함수는 숫자를 0부터, 알파벳을 a부터, 한글을 ㄱ부터 정렬한다.
문자열은 첫글자의 순서로 정렬한다.
첫글자의 자음이 같다면 두번째 정렬기준으로 모음의 순서를 따른다.

>

list = ["a","f","b","r","k","c","z"]
list.sort()
print(list)

실행 결과 : 
['a', 'b', 'c', 'f', 'k', 'r', 'z']
>

가끔은 리스트를 뒤집어야할 필요가 있을 수도 있다. 
정렬 시키는게 아니라 현재 리스트의 인덱스를 그대로 뒤집어야할 때, 사용할 수 있는 함수가 있다.
바로 `reverse()` 함수이다.

>

list = ["a","f","b","r","k","c","z"]
print(list)
list.reverse()
print(list)

실행 결과 : 
['a', 'f', 'b', 'r', 'k', 'c', 'z']
['z', 'c', 'k', 'r', 'b', 'f', 'a']
>

함수를 사용하지 않고도 할 수 있는 방법이 있다.
list[start:end:stride]의 슬라이싱 참조 방식에서, stride 값을 음수로 주면 거꾸로 참조하게 되는데, -1을 주면 맨 마지막 인덱스부터 첫번째 인덱스의 순서로 참조한다.

>

list = ["a","f","b","r","k","c","z"]
print(list)
print(list[::-1])

실행 결과 : 
['a', 'f', 'b', 'r', 'k', 'c', 'z']
['z', 'c', 'k', 'r', 'b', 'f', 'a']
>

방금 위에서 말한 슬라이싱을 다시 설명하자면,  list[start:end:stride]의 구조이다.
시작부터 끝까지의 인덱스번호를 지정하여 참조할 수 있는데, end-1번째 인덱스까지 참조가 되는 것을 기억해야한다.
그리고 stride는 적지 않아도 기본 값으로 1씩 증가하며 올라간다.
list[0:10:1]과 list[0:10]은 같다는 이야기이다.
이제 하나씩이 아니라 2개씩, 0,2,4,6,8 이런식으로 이동하고 싶다면
list[0:10:2]를 사용하면 된다.

또한 슬라이싱 방식은 리스트뿐만 아니라 문자열에서도 사용이 가능한데,
string="Hello, i'm maesaeng" 이라는 문자열에서 string[3:8]을 사용하면
"lo, i"이 출력된다.

출력 뿐만 아니라 값을 바꿔 저장할때에도 사용된다.
방금 예시로 그대로 사용하자면,
string[3:8]="sssss" 을 사용하면
string은 "Helsssss'm maesaeng" 로 변경된다.


#### 리스트의 곱셈
리스트의 곱셈이라니 무슨말인가 싶겠지만, 리스트 자료형에도 `*` 연산자를 쓸 수 있다.
>

list = ["a","f","b","r","k","c","z"]
print(list*2)

실행 결과 : 
['a', 'f', 'b', 'r', 'k', 'c', 'z', 'a', 'f', 'b', 'r', 'k', 'c', 'z']
>

이렇게 볼 수 있듯이, 리스트에 곱셈 연산자를 사용하면 문자열이 우항에 들어온 숫자만큼 반복한다.

#### 리스트의 아이템 위치 찾기
인덱스는 모르고 값만 알고있을 때, 혹은 특정 값과 같은 값의 인덱스를 찾을 때,
`index()` 함수를 사용하여 아이템의 인ㄴ덱스를 알아낼 수 있다.

>

list = ["a","f","b","r","k","c","z"]
print(list.index("b"))

실행 결과 : 
2
>

#### 리스트의 아이템 갯수 세기
특정 값이 리스트 내에서 얼마나 많은지를 알고싶을 때, 
`count()` 함수를 사용해 특정 아이템과 같은 아이템의 갯수를 파악할 수 있습니다.

>

list = ["a","f","b","a","k","c","a"]
print(list.count("a"))

실행 결과 :
3
>


0개의 댓글