Forensic/혼공파 챌린지

혼공파 3주차 미션

Ron Weasley 2021. 7. 25. 16:00
728x90

벌써 혼공파 6주중 반이 왔네요 ㅎㅎㅎ 그럼 바로 본론부터 시작하겠습니다.

이번에 포스팅할 것은 바로 이 부분입니다.

기본미션은 리스트, 딕셔너리, 범위 자료형에 대해 이해한 내용을 포스팅하고 선택미션은 157p에 1번 문제의 답을 쓰고 인증샷 하는것입니다. 바로 시작할게요!

 

리스트

  리스트는 여러가지 자료를 저장할 수 있는 공간이라고 생각하시면 됩니다. 리스트는 앞에서 배웠던 숫자나 문자, 수식들이 개별적인(단독적인) 자료였다면 이러한 자료들이 모여서 한 공간에서 사용할 수 있는 해주는 특별한 자료형입니다. 쉽게 말해서 정수 10보다 작은 홀수를 생각하면 1, 3, 5, 7, 9가 존재합니다. 이러한 집합을 어떻게 하면 쉽게 표현할 수 있을까 생각이 들 수 있는데 파이썬에는 이러한 불편함을 해소할 수 있는 자료형인 리스트가 존재합니다.

 

리스트의 정의에 대해 설명을 했으니 이제 리스트를 생성해보겠습니다.

<그림 1-1> 리스트 선언

<풀이>

① 변수 list_a에 리스트 자료형으로 된 원소의 집합 1, 3, 5, ,7, 9를 저장해라.

② 변수 list_a를 출력해라

<그림 1-1> 출력값

리스트는 "대괄호[]"에다가 자료를 쉼표로 구분해서 입력을 하게됩니다. 대괄호 안에 들어가는 값들을 element라고도하고 원소(요소)라고도 칭합니다. 위에 코드에서는 숫자로만 이루어진 리스트를 구성했지만, 실제로는 다양한 자료형들이 같이 구성될 수 있습니다.  바로 한번 알아보도록 하겠습니다.

<그림1-2> 여러 자료형 리스트 선언

이런식으로 숫자 자료형과 문자열 자료형이 하나의 리스트에 동시에 선언된것이 보이시나요?? 이처럼 리스트는 자신이 필요한 원소를 하나의 변수에 저장해둠으로써 나중에 배울 인덱스값으로 하나씩 하나씩 꺼내쓸 수 있습니다.

<그림1-2> 출력값

그런데..출력값을 보면 대괄호가 같이 출력되는것이 보입니다. 우리는 대괄호를 출력하고 싶지 않을 때도 분명히 있을것입니다. 이때 인덱스값을 지정해주면됩니다.

 

인덱스

  인덱스의 사전적인 의미는 저장되어 있는 데이터를 접근하기 위해 손가락으로 가르킨다?? 라고 설명이 될거같네요...이렇게 설명하면 누구도 알아들을 수 없으니 다시 한번 정의해보겠습니다. 우리가 리스트를 선언할 때 1, 3, 5, 7, 9라고 선언을 했다고 가정합시다. 그럼 선언한 리스트 전체를 출력하지말고 숫자 5만 출력하고 싶을 땐 우리가 5가 들어있는 공간에만 출력해줘라고 가르켜야 하잖아요?? 그럴때 인덱스 값이 필요하다는것입니다. 말로는 한계가 있으니 바로 예제로 들어가보도록 하겠습니다.

<그림1-3> 리스트 선언

코드를 보면 변수 list_a에 [0]번째 인덱스값. 즉, 대괄호 안에 [0], [1] ...[4]이게 인덱스값이라고 불리는것입니다.

5를 출력하고 싶으면 리스트 변수에 3번째 값을 가르켜야하면 [3]이 된다고 생각할 수 있지만 파이썬은 0부터 세는 제로인덱스이기 때문에 5를 출력하려면 [2]가 되어야합니다. 표를 한번 볼까요?

인덱스(Index) [0] [1] [2] [3] [4]
저장 값 1 3 5 7 9

파이썬은 0부터 세는 제로인덱스라고 했습니다. 그러니까 0번째 인덱스가 첫번째 인덱스 값이 되는것이지요.

[0]이 첫번째면 [4]가 마지막 다섯번째 인덱스 값이라고 알 수 있습니다. 그럼 출력값을 한번 볼게요 ㅎㅎ

<그림1-3> 출력값

어떤가요?? 위에 표랑 동일하게 출력이 된것을 볼 수 있죠?? 정리하자면 리스트는 같은 집합에 해당하는 값을 하나의 변수에 저장해두고 필요할 때 마다 하나씩 출력할 때 쓰인다고 볼 수 있습니다. 리스트에는 다양한 기능들이 존재하지만 전부다 적기에는 양이 너무 많으므로 필요하다고 생각하는 몇 가지만 적어두고 더 알고싶다면 책을 사셔서 보시는것을 추천합니다.

 

제가 생각할 때 중요하다고 생각하는것은 이중 리스트입니다.

이중 리스트란 말 그대로 리스트안에 리스트가 들어있는것입니다. 바로 코드를 한번 보시죠

<그림1-4> 이중 리스트

보이시나요?? 리스트 안에 리스트가 들어있는것을?? 처음 보시는분들은 이해가 안될 수 있지만 잘 보시면 아까 제가 위에서 리스트란 대괄호안에 자료를 넣어서 선언한다고 했죠?? 그럼 [1,2] [3,4] [5,6]도 리스트이고 바깥에 큰 대괄호도 리스트입니다. 그래서 이중 리스트입니다. [ [] ] 이런식으로 말이죠. C언어를 배우신분들은 쉽게 이해할 수 있습니다.

2차원배열이니까요...[행] [열] 이루어진 2차원 배열말입니다. 그럼 파이썬에서 이중 리스트안에 값 한 개만 꺼내오고 싶다면 어떻게해야할까요?? 아까 배운거처럼 print([0])을 하면 어떻게 출력이 되나 봅시다.

엥...? 이게 무슨일인가요? 우리는 1만 출력하고 싶은데 1, 2가 같이 출력이 되버렸지뭐에요...하지만 걱정할 것이 없는게 C언어도 파이썬도 안에 1만 출력할 수 있게 코드를 작성할 수 있습니다. 바로 작성해보겠습니다.

<그림1-5> 이중 리스트

어떠신가요?? 1이라는게 출력이됬죠?? 아까 위에도 설명했듯이 2차원 배열이라고 생각하면되는데 더 쉽게 설명하기 위해서 그림으로 보여드릴게요.

책꽂이

이렇게 큰 책꽂이가 4칸으로 나뉘어져있는 책꽂이가 있습니다 리스트와 같은 구성이죠 ㅎㅎ. 그럼 젤 밑에서부터 1층이고 제일 꼭대기가 4층이라고 가정을 해봅시다. 아까 우리가 인덱스는 0부터 시작한다고 했죠?? 그럼 1층이 [0]이 될것이고 4층이 [3]이 될것입니다. 그럼 큰 책꽂이에 4칸이 나뉘어져있는것으로 생각을 할 수 있습니다. 이렇게말이죠 [[0], [1], [2], [3]] 이해가 되시나요?? 안될거 같아서 한번 더 설명 하자면 책꽂이가 큰것이 칸마다 나뉘어져 있잖아요. 근데 파이썬은 제로 인덱스로 시작하니까 첫번째 부분을 [0]으로 생각하는것입니다. 그럼 이제 인덱스를 알았으니 칸에 들어있는 책을 우리가 한번 가르켜봅시다.

 

아까 큰 책꽂이를 4칸으로 나뉜것을 리스트라고 했습니다. 그럼 1층에 들어있는 책에 접근하려면 어떻게 해야할까요??

바로 이런식으로 [칸][위치]로 생각하시면됩니다. 물론 칸, 위치로 설명하는것이 정확한것은 아닙니다. 보통 [행][열]로 가르키는데 저는 책꽂이로 설명을 하기 때문에 행을 칸으로 열을 위치로 생각을 하겠습니다. 그럼 코드를 한번 보겠습니다.

1층([0])에 "혼공파", "혼공C" 책이 존재하고, 2층([1])에 "혼공자바", "혼공머신러닝"이 존재합니다. 우리는 혼공파를 배우고 있으니 혼공파를 불러오고 싶을것입니다. 그럼 아까 말했던대로 [칸] [위치]로 불러오겠습니다.

왜 이렇게 코드를 작성했냐면 1층이 0번 인덱스고 책 위치도 그대로 0번 인덱스로 시작해야하기 때문입니다. 그럼 출력값이 이렇게 나올것 입니다.

혼공파가 나오는것이 보이나요?? 이제 이중리스트에 개념에 대해서 어느정도 습득을 하셨을거니까 직접 코드를 구현해서 자신의 책꽂이에 있는 책을 출력해보시길 바랍니다 ㅎㅎㅎ (저도 잘 몰라서 설명이 잘 되셨나 궁금하네요)

그럼 리스트의 요소값을 추가하고 삭제하는 함수만 배우고 리스트는 여기까지만 하겠습니다.

 

리스트 요소 추가함수 : append(), insert()

 

append()

  append()함수는 리스트를 1,2,3,4를 선언하고 5라는 값을 더 추가하고 싶을때 [리스트명].append(5)라고 해주면됩니다. 어려운것이 아니니 바로 코드로 넘어가겠습니다.

처음에 list_a 변수에 1,2,3,4를 선언해주고 출력을 해보니 [1,2,3,4]가 출력되었습니다. 그리고 5를 추가하고 싶어서 list_a.append(5)를 해주고 리스트변수를 출력해줬더니 [1,2,3,4,5]가 출력이 되었습니다. 이로써 알 수 있는것은 append()함수는 리스트의 젤 뒤쪽에 추가가 되는것을 알 수 있습니다.

 

insert()

  또 다른 예로 리스트의 값에 [1,2,4,5]가 선언되었다고 가정합시다. 그럼 중간에 3이 없으니까 중간에 3을 추가하고 싶은데 아까 배운 리스트 요소 추가함수인 append()는 젤 뒤에 생긴다고 했습니다. 그러면 어떻게 해야할까요?? 바로 insert()함수를 사용하면 됩니다. insert()함수는 요소를 추가할 인덱스값을 지정해주어서 추가하고싶은 값을 추가할 수 있습니다. 바로 코드로 넘어가겠습니다.

처음에 list_a 변수에 1,2,4,5를 선언해주고 출력을 해보니 [1,2,4,5]가 출력되었습니다. 그리고 중간에 3을 추가하고 싶어서 인덱스 값을 계산해본결과 [0] = 1, [1] = 2, [2] = 4, [3] = 5였습니다. 그럼 우리는 4앞에 넣어야하니까 [2]의 값에 넣어준다면 [3] = 4, [4] = 5가 되버리겠죠?? 그래서 출력을 해보니 [1,2,3,4,5]가 출력이 되는것을 알 수 있습니다.

 

이제 리스트 요소를 추가하는것을 배웠으니 제거하는것도 배워보겠습니다.

 

리스트 요소 제거하기 : del(), pop(), clear()

 

del()

  del()함수는 리스트에 특정 인덱스에 있는 요소를 제거합니다. 아까 insert()는 특정 인덱스에 요소를 추가했다면 그 반대의 함수가 되겠죠. 바로 코드를보고 넘어가겠습니다.

보이시나요?? 인덱스 [4]번에 있는 값 5가 사라졌습니다. 이렇게 del함수는 특정한 인덱스의 부분을 지울 수 있습니다.

pop()

  pop()함수는 del함수와 비슷하게 제거할 위치에 있는 요소를 제거하지만, del함수와는 다르게 매개변수를 입려ㅑㄱ하지 않으면 마지막 요소를 제거하게됩니다. 바로 코드를 보겠습니다.

보시는것과 같이 리스트 [1,2,3,4,5]를 선언하고 pop함수로 [2]번 인덱스를 지웠습니다. 그래서 [1,2,4,5]가 남았는데 이번에는 인덱스값을 입력해주지 않으니까 제일 마지막 인덱스인 5가 사라졌습니다. 이제 pop()함수와 del()함수를 사용할 때는 pop()함수를 사용하는것이 좋겠죠?? ㅎㅎㅎㅎ 마지막으로 clear()함수를 보겠습니다.

 

clear()

  clear()함수는 말 그대로 클리어(정리, 깨끗하다)라는 뜻으로 리스트의 요소를 다 지우는것입니다. 바로 코드를 보겠습니다.

이렇게 리스트의 모든것에 대해서 배워보았습니다. 아마 어려운분들도 계실것이고 쉽게 생각 하시는분들도 있을것입니다. 모른다면 더 복습하고 안다고 복습을 하지 않는것은 안좋은거니 조금이라도 복습합시다 ㅎㅎㅎ

 

딕셔너리

  딕셔너리는 리스트와 비슷한 자료형입니다. 하지만 리스트는 인덱스를 기반으로 값을 저장하지만, 딕셔너리는 키를 기반으로 값을 저장하는것입니다. 리스트와는 다르게 대괄호가 아닌 {} 중괄호로 선언이 되기 때문에 헷갈릴 수 있습니다. 그리고 형태로 저장되기 때문에 리스트와는 쪼끔 까다롭습니다? 쉽게 설명하면 딕셔너리는 연관된 대응 관계를 표현하기 참 좋습니다. 예로 생일을 key로 생각하겠습니다. 그럼 value(값)은 뭐가되겠죠?? 포스팅한 날짜 07월 25일이 될것입니다. 다른 예로 성별은 key로 생각하시고  값은 male(남성), female(여성)이 있습니다. 이런식으로 대응되는 관계를 연결시킬 때 딕셔너리 자료형을 자주 사용합니다. 바로 소스코드를 보겠습니다.

보이시나요?? 중괄호로 묶어서 왼쪽에 있는것을 키, 오른쪽에 있는것을 값으로 저장을 합니다. 이것도 리스트와 비슷하게 특정 키 값만 출력할 수 있습니다. 앞에 Posting date만 출력해보겠습니다.

이런식으로 리스트처럼 요소 하나만 출력할 수 있습니다. 그리고 더 중요한것이 있습니다. 딕셔너리안에 리스트로도 저장을 할 수 있는것인데요. 왜냐면 성별같은 경우는 male, female처럼 두 개로 이루어지는데 하나하나 하기엔 복잡하기 때문에 동시에 적용이 되게끔 할 수 있다는것입니다.

이런식으로 말이죠 ㅎㅎ 그리고 딕셔너리에서 자주 실수하는 에러가 있는데 NameError라는것인데 사진으로 보여주면 너무 분량이 많아지므로 말로 설명하겠습니다. 우리가 딕셔너리를 선언할 때 "키", "값" 을 주었습니다. 즉, 큰따옴표 안에 키와 값을 다 넣었는데 gender : "male" 이런식으로 키에 따옴표를 넣어주지 않으면 NameError가 발생하는것입니다.

딕셔너리도 리스트와 같이 값을 추가하거나 삭제를 할 수 있는 기능들이 존재합니다.

 

딕셔너리 추가/삭제

두 기능을 한번 코드로 만들어보겠습니다.

<풀이>

① 비어있는 딕셔너리 변수 dict_a를 선언합니다.

② dict_a를 출력하니까 아무런 값도 나와있지 않은 빈 공간입니다.

③ 딕셔너리 요소를 추가하기 위해 Animal과 Food를 추가해줍니다.

④ 출력하니까 딕셔너리 요소가 추가된것을 알 수 있습니다.

⑤ 이제 del로 딕셔너리 값 Animal을 삭제를 했습니다.

⑥ Animal이 삭제된 Food만 출력되는것을 알 수 있습니다.

 

간단하죠?? 추가하기 위해서는 그냥 "딕셔너리["새로운 키"] = ["새로운 값"]"을 하면됩니다.

삭제는 "del 딕셔너리["키값"]"을 해주면됩니다.

 

in 키워드

  in 키워드는 딕셔너리에 존재하는 키 인지, 존재하지 않은 키 인지 확인할 수 있게 하기 위해서 만들어진것입니다. 리스트도 in키워드를 확인해서 내부에 값이 있는지 없는지 확인했던거처럼 딕셔너리도 마찬가지입니다. 코드를 한번 보겠습니다.

이와 같이 input()함수로 값을 입력 받을 때 입력한 값이 딕셔너리 안에 키값으로 있으면 출력하고, 없으면 존재하지 않습니다. 를 출력하는 함수입니다. 

 

그렇게 오늘 기본미션인 리스트와 딕셔너리에 대해서 배워보았는데, 잘 설명했나 모르겠습니다. ㅎㅎㅎ 앞으로도 남은 3주동안 열심히 해보겠습니다. 

 

마지막으로 선택미션인 157p만 올리고 포스팅을 마치도록 하겠습니다.

list_a = [0,1,2,3,4,5,6,7]
함수 list_a의값
list_a.extend(list_a) [0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7]
list_a.append(10) [0, 1, 2, 3, 4, 5, 6, 7, 10]
list_a.insert(3, 0) [0, 1, 2, 0, 3, 4, 5, 6, 7]
list_a.remove(3) [0, 1, 2, 4, 5, 6, 7]
list_a.pop(3) [0, 1, 2, 4, 5, 6, 7]
list_a.clear() []

4주차때 봅시다~ 안녕!

728x90