이제 파이썬에서 자료형을 보았으니 그렇게 본 자료형들을 어떻게 처리 할지, 프로그램을 제어해야 할 것 같습니다. 따라서, 프로그램의 제어문에 대해서 보도록 하겠습니다. 즉 처리를 하는데, A 가 무엇무엇하면 B를 하고 아니면 C를 한다, A를 몇 번 실행한다. 이런 것을 학습하도록 하는데, 맨 처음에 학습하는 IF문은 말 그대로, IF 즉 조건문입니다. 


IF는 대표적으로 IF, 그리고 If - Else, IF-Elif-Else 마지막으로 중복 IF문으로 나눠 볼 수 있는데, 단독 IF문의 사용은 If-Elif의 사용에서 충분히 알 수 있으므로 이번에는 If-Elif-(Else), 그리고 중복 If문에 대해서만 살펴 보도록 하겠습니다. 


1. If - Elif - Else 문. 


If - Elif - Else문

먼저 If문을 실행해서 조건을 살펴 본 다음에, 조건이 맞으면 If문의 조건 밑의 코드를 실행합니다. 그리고 나머지는 무시하고 실행하지 않는다. 

If 조건:

Code


Elif 조건:

Code


Else: 

Code


주) If1 - If2 - If3 의 코드 일 경우에는 If문1의 조건을 보고 조건이 맞으면 코드를 실행하고, If문2의 조건을 보고 조건이 맞으면 코드를 실행하고, If문3의 조건을 보고 조건이 맞으면 코드를 실행하고.....를 반복한다. 처음에 대체 If - Elif와 If - If의 차이가 뭔지 궁금했는데 제대로 알려 주는 곳이 없어서 적어 둡니다 

그 다음에 Elif의 조건을 보고 만약에 조건이 맞다면 코드를 실행하다고 그렇지 않다면 Else문을 실행합니다. Else문은 존재하지 않고, Elif로 끝나도 되지만 Elif로 해결되지 못하는 나머지 모든 조건에 코드를 실행해야 할 경우에 사용합니다. 그렇지 않을 경우, 여러 개의 Elif문을 사용해야 합니다. 코드가 좀 길어 지겠지만 Elif를 쓰는 게 확실하긴 하겠죠. 참고로 Elif는 Else - if의 준말로 우리 말로는 그렇지 않으면 입니다. 다른 언어에서는 Elseif입니다. 



대표적인 성적 예시를 살펴 보겠습니다. 

1. If - Elif (- Else)

import random


score = 90
attendance = 'great'

if score >= 90 and attendance =='great':
    print("your score is A+")
elif score >= 90 and attendance !='great':
    print("your score is A-")
elif score >= 80 and attendance =='great':
    print("your score is B+")
else:
    print("your score is C")

your score is A+


위는 Score와 Attendance로 성적을 판별하는 간단한 프로그램입니다.

설명과 함께 간단하게 코드를 알아 보겠습니다. If의 조건문: Score >=90 그리고(and) 출석 great || If의 코드: A+를 출력하고, Elif1의 조건문 Score>=90 그리고(and) 출석이 great가 아님(!=) || Elif1의 코드: A-를 출력 Elif2의 조건문 Score>=80 그리고(and) 출석이 great || Elif1의 코드: B를 출력 Else C를 출력


이는 중복 If 를 이용해서도 비슷하게 구현 될 수 있는데 자세한 코드를 보면 다음과 같습니다. 


2. 중복 If

if score >= 90:
    grade = 'A'
    if attendance =="great":
        grade_plus = grade + '+'
else:
    grade__plus = 'B'
grade_plus
Out[12]:
'A+'

간단하게 If - elif로 구현 할 수 있는 걸 굳이 중복 if문으로 구현 했으니 변수가 늘어나고 그런 걸 볼 수 있지만 지금은 그런 것보다, 중복 if문을 이해하는데 의의를 두면

좋을 것 같습니다. 간단한 코드지만 line by line으로 해석을 해보면, 


if1 조건: 위애서 정의한 score가 90이상 || if1의 코드: if 실행 새로운 변수 grade에 A대입한 뒤, 다시 if2문 실행(중복 if문)

if2 조건: 위에서 정의한 attendance가 great || if2의 코드: grade_plus라는 변수 정의 한 후, grade 변수에 character형 '+' 추가

else: grade_plus에 B대입 


grade_plus 출력


if문에 대해서 간단하게 알아 보았으니 다음에는 제어문 중에서 반복문의 기초가 되는 While문에 대해서 알아보도록 하겠습니다. While문도 프로그래밍 상 여러모로 쓸모가 많은 구문이기 때문에 숙지하시기 바랍니다. 저도 포스팅 하면서 여러모로 배우는 점이 많네요 ㅎㅎ



from IPython.core.display import display, HTML
display(HTML("<style>.container{width:90%!important;}</style>"))

주피터 노트북 블로그에 맞기 정렬하기


https://versusall.tistory.com/entry/1-Tistory-%EA%B8%80%EC%93%B0%EA%B8%B0-tip



'머신러닝 > 기초 문법' 카테고리의 다른 글

7. While. Break, Continue  (0) 2019.02.10
6. IF 문  (0) 2019.02.09
넘파이 기초 - 배열 생성(1)  (0) 2019.01.31
넘파이 기초 - 색인과 슬라이싱 기초(2)  (1) 2019.01.31
5. 딕셔너리 심화 - (2)  (0) 2019.01.30
import numpy as np import random 
In [18]:
list_data1 = [1,2,3,4] 
In [22]:
list_data1 
Out[22]:
[1, 2, 3, 4]

list를 ndarray로 변환하는 간단한 메서드를 생성합니다.

In [20]:
nd_list_data1 = np.array(list_data1) #array - 순차형 데이터를 ndarray로 변환 
In [21]:
nd_list_data1 
Out[21]:
array([1, 2, 3, 4])

기존에 python 리스트는 그냥 []로 나왔지만 ndarray의 경우 array[]로 나왔습니다.

In [24]:
nd_list_data1.ndim #1차원인 경우 열을 먼저 출력해 줌...? 
Out[24]:
1

차원을 출력하는 메서드는 .ndim이고

In [25]:
nd_list_data1.shape 
Out[25]:
(4,)

 

ndarray의 형태를 출력하는 방법은 .shape입니다. 자주 사용하고 직관적이기 때문에

외워 두시면 좋을 것 같습니다. 참고로 list에는 없는 메서드이기 때문에 참고해 두시면 좋을 것 같습니다.

In [27]:
nd_list_data1.dtype 
Out[27]:
dtype('int64')
In [29]:
zero = np.zeros(2) 
In [30]:
zero 
Out[30]:
array([0., 0.])
In [46]:
zero = np.zeros((3,6)) #내용을 0으로 채워서 ndarray 생성 
In [47]:
zero 
Out[47]:
array([[0., 0., 0., 0., 0., 0.],        [0., 0., 0., 0., 0., 0.],        [0., 0., 0., 0., 0., 0.]])

zeros()는 0으로 초기화된 ndarray를 생성합니다.

In [48]:
zero.shape 
Out[48]:
(3, 6)
In [49]:
np.empty((2,3,2)) #초기화되지 않고 채워진 배열을 반환 
Out[49]:
array([[[6.73898103e+149, 5.30276956e+180],         [3.31033942e-033, 6.97532527e-076],         [4.46234816e-086, 3.36010587e-143]],         [[6.01433264e+175, 6.93885958e+218],         [5.56218858e+180, 3.94356143e+180],         [5.64124820e-038, 9.96020951e-047]]])

empty(층, 행, 열) 메서드는 아무 값이나 랜덤으로 채운 채뤄 배열을 반환.

In [50]:
np.eye(3,3) #희박 행렬 생성.  
Out[50]:
array([[1., 0., 0.],        [0., 1., 0.],        [0., 0., 1.]])

eye는 희박 행렬을 생성하는데, 선형대수에서 많이 사용하는데 저는 선형 대수를 하지 않지만

선형 대수를 하시는 분은 eye 메서드를 그냥 외워 두시면 좋을 것 같습니다.

In [51]:
np.arange(5) #파이썬의 range와 유사. ndarray를 반환.  
Out[51]:
array([0, 1, 2, 3, 4])
In [ ]:
 

                              arange는 range랑 비슷하게, 0 ~ n 까지의 숫자를 생성하기 때문에 초기화를 할 때 잘 쓰는 함수입니다. 

   또는 그래프를 그릴 때 index를 사용 할 수 있겠죠.   

'머신러닝 > 기초 문법' 카테고리의 다른 글

6. IF 문  (0) 2019.02.09
주피터 노트북 블로그에 맞기 정렬하기  (0) 2019.02.08
넘파이 기초 - 색인과 슬라이싱 기초(2)  (1) 2019.01.31
5. 딕셔너리 심화 - (2)  (0) 2019.01.30
5. 딕셔너리 기초 - (1)  (0) 2019.01.29

 

 원래 넘파이랑 판다스는 파이썬을 완전히 끝낸 다음에 포스팅 하려고 했는데 간단한 부분 - (인덱싱이랑 슬라이싱) - 은 먼저 포스팅 하도록 하겠습니다. 코딩은 iPython이 아닌 jupyter notebook에서 작성 했음을 미리 알립니다. 주피터 노트북의 경우 딱 포스트 부분에 맞게 조절하는 방법이 있는 거 같은데 왜 전 안 될 까요ㅠㅠ 아무튼 안 되면 안 되는대로, 딱히 칸을 넘어가는 부분도 없으니까 일단 포스팅 하도록 하겠습니다. 

 

1. 1차원 배열 인덱싱

import numpy as nd

In [2]:

arr = np.arange(10)

In [3]:
arr 
Out[3]:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

arange메소드는 설명하지 않았지만 파이썬의 리스트에서 range메서드와

비슷한 역할을 합니다. 따라서 주로 초기화 하는데 저는 사용합니다. 그 외에는 거의 사용하는

적이 없는 것 같습니다.

In [4]:
arr[5] 
Out[4]:
5
In [5]:
arr[5:8] 
Out[5]:
array([5, 6, 7])

1차원 ndarray는 list와 거의 동일하게 동작합니다. 그냥 이 부분에 사용 할 수 있는 메서드가

다르다는 점만 있죠. 주로 많이 사용하는 2차원 ndarray에서 부터 주의가 많이 필요합니다.

In [6]:
arr[5:8] = 12 #색인 영역에 대입한 값이 전파된다. - 브로드캐스팅 
In [7]:
arr 
Out[7]:
array([ 0,  1,  2,  3,  4, 12, 12, 12,  8,  9])

위와 같이 값을 전파 시키는 것을 브로드 캐스팅이라고 합니다. 색인 영역을 잘라서 (슬라이싱) 해서 값을 대입한 후,

이 값을 : 이 후부터 전파시키기 때문에 브로드 캐스팅이라고 합니다.

In [8]:
arr[5:8] 
Out[8]:
array([12, 12, 12])
In [9]:
arr_slice = arr[5:8] 
In [10]:
arr_slice[1]=12345 
In [11]:
arr 
Out[11]:
array([    0,     1,     2,     3,     4,    12, 12345,    12,     8,            9])
In [12]:
arr_slice 
Out[12]:
array([   12, 12345,    12])

이 경우  arr_slice의 처음 값이 [5], 그리고 2번째 index인 arr_slice[1]값이 전체 arr[6]이기 때문에 12345가 대입이 됩니다. 

1차원 ndarray는 위에서 언급했다시피 list와 비슷하기 때문에 많이 공부 할 필요가 없지만 2차원 이후로부터 좀 공부를 해야하죠. 

 

이제 살펴보도록 합시다.

2. 2/3차원 배열 인덱싱 

 

arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]]) 
In [15]:
arr2d[1] #2차원 배열에서 단순한 색인 값은 스칼라 값이 아니라 1차원 배열이 된다.  
Out[15]:
array([4, 5, 6])

2차원 ndarray를 생성 하였는데, [123],[4,5,6],[7,8,9] 배열을 하나 더 둘러 싸고 있는

그림입니다. 따라서 1번 index는 [4,5,6]전체 배열이 되겠죠?

In [16]:
#개별 스칼라 요소에 접근 할 때는 [][] 처럼 콤마로 구분 된 색인 리스트로 접근 해야 한다 arr2d[1][0] 
Out[16]:
4

반면에 스칼라 값 하나에 접근 하려면 어느 배열의, 어느 열에 속하는지, 지정 해야합니다.

만약에, 2행[2] 0열[0]이면 arr2d[2][0] 즉, 7을 출력하게 되겠습니다.

In [17]:
arr3d = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]]) # 3차원 배열의 경우 잘 시용되지 않지만 층,행,열 로 접근 됨 
In [18]:
arr3d[0] #0층 
Out[18]:
array([[1, 2, 3],        [4, 5, 6]])

해당 배열은 0층과 1층으로 나뉘어져 있는데 맨 앞에 있는 것이 층, 그 다음이 행, 그리고 마지막이 열로서,

index로 접근 할 때도 층,행,열로 접근 하면 됩니다. 다음을 살펴 볼까요?

In [19]:
arr3d[1] #1층 
Out[19]:
array([[ 7,  8,  9],        [10, 11, 12]])

 

1층이기 때문에 위와 같이 출력해 줍니다. 반면에 2층은 존재 하지 않기 때문에 index가 존재하지 않는다고

에러 메세지를 출력하는군요. 바람직 합니다.

In [20]:
arr3d[2] #2층 없음 
 
--------------------------------------------------------------------------- IndexError                                Traceback (most recent call last) <ipython-input-20-f1c4238f3db7> in <module> ----> 1 arr3d[2] #2층 없음  IndexError: index 2 is out of bounds for axis 0 with size 2
In [ ]:
arr3d[0]=42 
In [21]:
old_values = arr3d[0].copy() 
In [22]:
arr3d[0]=42 
In [23]:
arr3d 
Out[23]:
array([[[42, 42, 42],         [42, 42, 42]],         [[ 7,  8,  9],         [10, 11, 12]]])

값을 대입 해 봤습니다. 0층에 42 값을 대입했고,

나중에 다시 값을 바꾸기 위해 old_values에 이전에 있던 값들을 복사 해 놨습니다.

In [24]:
arr3d[0]=old_values 
In [25]:
arr3d 
Out[25]:
array([[[ 1,  2,  3],         [ 4,  5,  6]],         [[ 7,  8,  9],         [10, 11, 12]]])

다시 old_values를 0층에 넣었더니 값이 원래대로 변했습니다.

In [26]:
arr3d[1,0] # -> 1층에, 0행 , 열 생략한 상태 
Out[26]:
array([7, 8, 9])

 

3차원 배열의 index가 어떻게 사용되는 지 알아보기 위해서(층,행,열)직접 코딩을 해 봤습니다.

1층, 0행 이니까, (열은 쓰지 않았음)

[7,8,9],

[10,11,12].

중에서

 

[7,8,9]열을 고를 것 같습니다.

 

예상대로 위에서는 해당 열을 골랐습니다. 그럼 이번에는 열을 골라 봅시다.

In [27]:
arr3d[1,1,1] # -> 1층, 1행, 1열 
Out[27]:
11

1층이므로, 
[7,8,9]
[10,11,12]
1행이므로
[10,11,12]
1열이므로

11을 출력 할 것입니다.

 

헷갈리신다면 다시 한 번 보시면 이해가 가실 겁니다. 별로 어렵지 않은 부분이니까요.

 

 

3. 색인과 슬라이싱 기초 / 슬라이스 색인

 

#--------------------슬라이스 색인----------------------# 
In [29]:
arr2d 
Out[29]:
array([[1, 2, 3],        [4, 5, 6],        [7, 8, 9]])
In [30]:
arr3d 
Out[30]:
array([[[ 1,  2,  3],         [ 4,  5,  6]],         [[ 7,  8,  9],         [10, 11, 12]]])
In [31]:
arr2d[:2] #2행까지 슬라이싱 
Out[31]:
array([[1, 2, 3],        [4, 5, 6]])

2차원 ndarray도 1차원 ndarray를 조금 확장 해서 생각해 보시면 됩니다.

층, 행, 열이라고 했는데, 2darray에는 층이라는 게 존재하지 않으므로 신경 쓸 필요가 없습니다.

행을 슬라이스 , 즉, 2행 이상을 모두 잘라서 보여주는 거라고 생각 하시면 됩니다.

In [32]:
arr2d[:2,1:] #2행까지 슬라이싱 하고, 1열이후로 슬라이싱 
Out[32]:
array([[2, 3],        [5, 6]])

뒤에 열이 붙긴 했지만 2행 위를 자르고, 1행 다음으로 자른 슬라이싱을 출력합니다.

위에 슬라이싱 개념을 생각해 보시고 조금 확장 해서 생각해 보시면 될 것 같습니다.

In [33]:
arr2d[1,:2] #arr2d[1,] 이렇게 사용하는 것을 정수 색인이라고 한다. 나중에 다르게 사용되는 것도 있으니 알아두도록 한다.  
Out[33]:
array([4, 5])

해당 1: 이나 :1 이 아닌 1이라고 쓰는 것을 정수 색인이라고 합니다.

나중에 판다스랑 조금 다르게 사용되는 부분이 있으므로 기억해 두시기 바랍니다.

이 부분은 정확히 1행에, [4,5,6] 2열 아래로 자르므로 [4,5]행을 출력합니다.

In [34]:
arr2d[:,:1] #:만 사용하면 전체 축(모든 행 또는 모든 열)을 의미한다. 따라서 원래 차원의 슬라이스를 얻을 수 있다.  
Out[34]:
array([[1],        [4],        [7]])

마지막으로 전체 행을 뜻하는 : 을 알아 봅시다. : 전체 행에서 , :1 1열 전을 얘기하므로,

[1]

[4]

[7]

열만 출력합니다.

 

 

넘파이에는 슬라이스 색인 이외에도 불리언 색인과 팬시 색인이라는 중요한 개념이 있는데 이 부분은 좀 더 공부를 하고 포스팅을 할 예정입니다. 그 이전까지는 파이썬에 집중 해야죠. 그럼 오늘 포스팅은 여기까지 하고 마치도록 하겠습니다. 
 
 
 
 
 
 

 

 저번에 Dictionary를 생성하고 삭제하는 간단한 방법에 대해서 공부했다면 오늘은 저번에 이어 딕셔너리의 좀 더 복잡한 사용법에 대해서 공부해 보도록 하겠습니다. 저번에 딕셔너리는 {key: value} 가 맵핑되어 있는 집합이자 딕셔너리의 키 값은 Immtable하고, 값은 Mutable하다고 했습니다. 그런데 여기서 Key가 중복되면 에러를 출력해 줄까요? 불행하게도 그렇지 않습니다. 에러를 출력해 주면 내가 뭘 잘못했는지 알고 수정 할 텐데, 그렇지 않습니다. 그냥 값을 출력해 줍니다. 즉, 다음과 같습니다.

 

 

위와 같이 마지막 값만 출력해 줍니다. 이것은 파이썬이 잘못된 언어가 아니라, value가 변할 수 있는 값이기 때문에 마지막 값으로 덮어 씌워지는 것입니다. 딕셔너리 기초에서 봤는데, 딕셔너리는 왜 index로 접근 할 수 없었을까요? index가 존재하지 않고 대신에 key라는 변하지 않는 참조 가능한 값이 있기 때문입니다.

 

 

dictionary를 선언하는 방법은 list 처럼 하되, dictionary가 대괄호로 들러쌓여 있으므로 = { } 처럼 선언해 줍니다. 아니면 딕셔너리 Constructor로도 생성이 가능한데 주의 할 점은 dictionary constructor를 사용할 떄는 대괄호가 아닌 소괄호로 둘러 쌓아 줘야 하고, key에 ' '을 사용하면 안 된다는 점입니다. 사용은 다음과 같이 하면 됩니다.

 

 

리스트 속에 다음과 같이 [ [key, value] ] 키와 value값이 나란히 있으면, dict() 메서드를 통해 dictionary로 변환이 가능합니다.

 

 

딕셔너리에서 키:값 쌍을 여러 개를 만들 고 싶을 경우,

 

 

 

하나의 리스트에 모두다 쓰면 dict 에러가 납니다.

a=[ ['a',1], ['b',1] ] 처럼 나눠써야 에러가 나지 않고 정상적으로 출력이 됩니다. 이러한 점 알아 두시기 바랍니다.

 

딕셔너리를 print하고 싶을 경우, 보통, print 하는 것처럼 형식 지정자를 사용할 필요 없이 바로 print함수 안에 dictionary이름을 적으면 됩니다. print함수가 아니면 pprint 모듈을 import해서 dictionary를 출력할 수도 있습니다.

 

 

오늘은 딕셔너리를 좀 더 자세히 알아 봤습니다만, 충분하지는 않을 것으로 생각됩니다. 저도 충분히 공부했다고 생각되지 않으니까요 ㅎㅎ;;

관련해서 사용하는 것은 pandas와 numpy를 공부할 때 같이 배우도록 하겠습니다.

 

그럼 오늘은 이만 마치도록 하겠습니다.

 

참고자료: https://wikidocs.net/16043

이번엔 파이썬의 특수한 자료형인 딕셔너리 자료형을 학습하도록 하겠습니다. 해당 자료형은 저도 잘 사용하지 않는 관계로 자세하게 공부하면서 포스팅을 해야 하겠습니다. 제가 딕셔너리 자료형을 소홀히 한 이유는 다른 언어에서는 배열만 존재하고 해당 배열이 파이썬 언어에서는 리스트로 사용되기 때문에 딕셔너리 자료형은 자주 사용되지 않거니 하고 생각해기 때문입니다. 하지만 생각보다 자주 사용되더군요. 따라서 생성부터 자세하게 알아보도록 하겠습니다.

 

출처: https://wikidocs.net/16 

(점프 투 파이썬)

 

1. 딕셔너리 자료형의 생성

 

기본적으로 딕셔너리 자료형은 Index로 이루어져 있지 않고 key : value 이렇게 사전처럼 이루어져 있으므로 생성 할 때도, key값과 value값을 모두 생성 해 줘야 합니다. DB를 배우신 분은 아시겠지만 KEY값은 일반적으로 유일한 값이어야 한다는 것을 아실 것입니다. 그리고 파이썬의 딕셔너리에서도 유일한 값으로 사용합니다. 그러면 코딩을 해서 생성 해보록 하겠습니다.

 

 

 dic이라는 dictionary에 zipcode와 phone을 'key'와 value쌍으로 추가 했습니다. 그런데 여기에 이름이 빠진 것 같아서 'name'과 그에 해당하는 값을 추가 해 줬습니다. 추가하는 방법은 dictionary 이름['key 이름'] = value 입니다. 이렇게 해 줬더니. 값이 정상적으로 들어 간 것을 확인 할 수가 있습니다. 그런데 핸드폰이 dictionary에서 필요가 없어졌다고 합니다. 그러면 삭제를 해 줘야 하는데 이건 del명령어를 사용해줘야 합니다. 즉, del dictionary이름['key이름'] 이렇게 지우면 됩니다. 그러면 정상적으로 phone 값이 사라진 것을 볼 수 있습니다.

 

 기존에 인덱스로 자료에 접근하던 프로그래머들에게는 매우 생소한 자료형이긴 하지만 처음 프로그래밍 하는 사람들에게는 오히려 이게 편리 할 수도 있을 것 같긴 합니다. 프로그래밍 시에는 리스트나 Ndarray가 더 많이 쓰이긴 하지만요. (딕셔너리도 의외로 쓰이긴 합니다. 무시해서는 큰 코 다칩니다. 저처럼요)

 

 그럼 다음으로 넘어가서. 딕셔너리를 활용하는 방법에 대해서 알아 보도록 하겠습니다. 실제로는 판다스 DataFrame안에 넣어서 사용하거나 하지만 저처럼 기초를 모르면 흔들리기 때문에 기초부터 자세히 짚고 넘어가도록 하겠습니다.

 

 

 

 dictionary에 접근하는 방법은 dictionary이름['key'] 입니다. 추가하는 방법과 비슷합니다. 따라서 나중에 공부하도록 하겠지만 pandas나 numpy에서 한 열이나 행을 출력하거나 할 때도 딕셔너리를 이렇게 사용 할 수 있겠네요. 하지만 For문으로 i+를 통해서 index를 증가 시키면서 점진적으로 출력시키는 데에는 어려움이 있을 것 같습니다. 그래서 list를 사용합니다. dictionary의 key이름이 [1] [2]....이렇게 index처럼 구분 될 수 있으면 반복 문이 사용 될 수도 있겠네요. 어쨌든, 그건 추후의 일이고.

 

 앞에서도 언급했는데, 딕셔너리를 만들 때 주의해야 할 사항은 첫째로  key는 반드시 유일해야 한다는 것입니다. 그렇지 않으면 하나를 제외한 나머지 값들이 무시되어 버리는 현상이 발생해 버립니다. 그리고 key는 불변해야 한다는 것 입니다.

 

 

2. 딕셔너리 관련 기초 함수

 

 

딕셔너리를 자유롭게 다루기 위해서는 관련 개념을 아는 것 뿐만 아니라, 동작하는 함수들도 알고 있어야만 합니다. 물론 필요 할 시에 참조해도 됩니다. 그냥 이런 기능이 있었지~하고 알고 있으면 됩니다.

 

 

 

 dictionary.keys() 라는 함수가 있습니다. 그러면 이 함수는 dictionary의 key만을 모아서 dict_key라는 객체를 리턴합니다. 주의 할 것은 여기서 이것은 리스트처럼 보이지만, 리스트가 아니라는 점입니다. 파이썬 2.x, 정확히는 2.7까지는 dict_key는 list를 리턴했지만 3.0이후에는 list가 아닌 단순한 객체로서 리턴 되었습니다.

 

 

 

 

dictionary.keys()가 출력하는 것이 list였다면 list()안에 들어가서 list가 만들어 질리가 없겠죠? 그런데 list가 만들어 졌습니다.

 

 뿐만 아니라 리스트 함수인 append를 사용 할 수 없다는 에러 메세지가 출력이 됩니다. 이러한 정황들로 봐서, dictionary.keys()가 출력하는 것은 리스트가 아닌 단순한 객체를 출력하는 것으로 볼 수 있습니다.

 

dictionary.keys()와 비슷하게 dictionary의 value값을 얻고 싶다면 dictionary.values()함수를 사용하면 됩니다. 이것도 싫다. 나는 key랑 value 쌍으로 얻고 싶다. 하면 dictionaly.items()함수를 사용하시면 됩니다. 사용은 다음과 같이 하시면 됩니다. 생각보다 매우 간단합니다.

 

 

 

각각 dictionary.values()는 dict_values객체를 그리고 dictionary.items()는 dict_items객체를 리턴 하는 것을 볼 수 있습니다. 뿐만 아니라 dictionary자료형은 list처럼 clear()함수를 통해 dictionaryd의 key : value 쌍을 지우는 것을 지원 합니다. dictionary.clear() 이렇게 사용하면 되겠습니다.

 

 딕셔너리 자료형은 저도 잘 모르는 관계로 공부하면서 포스팅 하고 있습니다. 그래서 기초와 심화로 나누어서 포스팅 할 것입니다. 이번에 dictionary를 잘 공부해두면 저도 좋고 이걸 보시는 분들도 좋을 것 같아서 말이죠 ㅎㅎ

 

 

 

'머신러닝 > 기초 문법' 카테고리의 다른 글

넘파이 기초 - 색인과 슬라이싱 기초(2)  (1) 2019.01.31
5. 딕셔너리 심화 - (2)  (0) 2019.01.30
4. 리스트와 관련 메서드  (0) 2019.01.28
3. String -(2) : string 함수  (0) 2019.01.24
3. String - (1)  (0) 2019.01.22

 파이썬에서 가장 많이 사용하는 변수 형 중 하나로 리스트가 있습니다. 다른 언어에서 배열로 생각하면 되지만 다른 언어보다 기능이 좀 더 추가되어서 진화된(?) 배열이라고 생각하시면 될 것 같습니다. 그리고 나중에 학습 할 Numpy 배열인 Ndarray는 보다 더 효율적인 함수들을 많이 가지고 있습니다. 그럼 IDE를 키시고 코딩을 시작하시죠.

 

 

1. 리스트의 생성과 인덱싱/슬라이싱

 

 - 리스트의 생성은 위아 같이 a = [ ]  처럼 셍성을 합니다. 만약 [ ] 로 생성을 하면 빈 배열을 생성한다는 뜻인데, 처음에는 초기화 해주는 것이 좋습니다. Null값 때문에 값을 넣을 수 없다는 에러 값을 자주 내뱉기 때문입니다. 부득이한 경우에는 어쩔 수 없지만 말이죠.

 

 - a[0] a[1] a[-1] 처럼 저번에 String에서 배웠던 것처럼 인덱싱을 할 수 있습니다. a 리스트는 0번 인덱스에 1값을 가지고 있기 때문에 a[0]에 따라 1값을 출력합니다. 그리고 저번에 -1은 맨 끝 값을 의미한다고 했습니다. 그렇기 때문에 a[-1]은 a리스트의 마지막 원소인 4를 출력합니다.

 

 - 리스트 슬라이싱의 경우도 스트링과 비슷합니다. 리스트 또한 스트링 처럼 슬라이싱하라고 명령을 할 수 있는데 이 경우에는 a 리스트의 0에서 2를 자르라고 명령 을 하였습니다. 따라서 0인덱스 부터 2인덱스 바로 이전인 1인덱스까지인 [1, 2]를 출력해 줍니다.

 

2. 주요 리스트 함수.

 

 

자주 쓰는 메서드 및 함수들에 대해서 살펴보도록 하겠습니다.

 

2.1 Append / Extend

 

 두 메서드 둘 다 리스트에 원소를 추가하는 메서드입니다. 언뜻 보면 똑같아 보입니다. a에 원소 하나를 append 했더니 1,2,3,4,5가 되었다.

 그 다음에 [1,2,3,4,5] 리스트 안에 리스트를 더 추가하고 싶어서 extend를 써 봤습니다. append는 앞에서 그냥 원소가 추가 되었으니까. 그럼 그냥 append로 추가 해 봤습니다. 그랬더니 list가 들어갔습니다.

 

그러면 extend는 대체 하는 일이 뭘까요? 위에서 보시다시피 리스트를 리스트의 엘레멘트들로 추가 하는 역할을 합니다. append(1)은 에러가 나지 않지만 extend(1)은 에러가 납니다. extend는 에러가 나기 때문입니다. 두 메서드의 차이점을 아시고 사용하시기 바랍니다.

 

2.2 Clear

3.5 버전인가 3.3 이후에 추가된 메서드로, 특정 리스트를 모두 제거하는 함수입니다. 기존에는 del메서드를 사용해서 del a[:] (주 : 는 전체를 슬라이싱 하므로, 리스트의 전체를 의미함) a리스트의 전체를 삭제 하였습니다. 하지만 이제는 clear함수를 사용 할 수 있게 되어서 a,clear() 처럼 사용하면 리스트를 모두 비울 수 있게 되었습니다. 따라서 주기적으로 리스트를 삭제 하거나 메모리에서 비울 필요가 있으면 clear()를 사용 해서 편하게 사용 할 수 있게 되었습니다.  

 

 

 

3. pop

리스트의 가장 기본은 위의 1,2번으로 끝입니다. 노가다 코딩으로 (ㅎㅎ) 할 수 있지만 좀 더 효율적인 코딩을 위해서 상황에 맞게 Numpy를 사용하고 파이썬만을 사용한다면 다른 메서드들을 사용하는 것입니다. 귀찮으신 분들은 위에 1,2,번 까지만 보세요. 아래는 좀 덜 중요한 함수입니다. 하지만 그래도 그렇게 수준급이 아닌 제가 많이 사용하는 함수이니 익혀 두시는 것도 좋을 듯 합니다.

 

pop은 자료구조를 좀 배워 보신 분은 아시겠지만 pop구조라는 것을 아시는 분도 있이실 겁니다. 뒤에서부터 뺴내는 거죠.

 

 

 

위와 같은 방식으로 말입니다. 그래서 기본적으로 a.pop()이렇게 써 놓으면 리스트의 맨 뒤에서부터 한 번 출력한 다음에 빼내지만 괄호안에 인덱스를 써주면 인덱스에 있는 리스트 값을 출력하고 빼냅니다. 그래서 위와 같이 실제 코딩 할 때 print (a.pop()) 처럼 사용 할 수 있습니다.  그러면 리스트의 뒤에서 값이 하나씩 출력되면서 값이 하나씩 빠져 나오는 코드가 생성됩니다.  아직 배우진 않았지만 반복문이랑 같이 사용해보면 다음과 같이 쓰여지겠죠.

 

for i in range(0, 10):

print(a.pop())

 

4. insert/count

 

 append나 extend는 뒤에만 값을 붙여 넣을 수 있었지만 insert의 경우에는 인덱스를 정해서 값을 집어 넣을 수 있습니다. 위에서는 값만 집어 넣지만 a.insert(0,[1,2,3])처럼 리스트를 집어 넣을 수도 있습니다. 하지만 특별한 경우가 아니면 인덱스까지 굳이 찾아서 프로그래밍을 하지 않기 때문에 계속 사용하지는 않죠 ㅎㅎ append나 아니면 미리 리스트의 형태를 만들어서 대입을 해주는 경우가 많습니다. 그래도 알아둬서 나쁠 건 없는 메서드 입니다. 필요 할 경우가 분명히 있긴 있거든요.

 

count는 리스트 내부의 값을 세는 메서드 입니다. 저도 실제로 그렇게 사용해 봤습니다. 하지만 별도로 용도가 있는 지는 모르겠군요.

 

 

 

 

 

 

 

 

 

이제 마지막으로 Dictionary만 하면 대략적인 자료형은 끝이 나는군요 ㅎㅎ 자료형이 끝나면 제어문으로 바로 넘어가면 되겠습니다!

 

'머신러닝 > 기초 문법' 카테고리의 다른 글

5. 딕셔너리 심화 - (2)  (0) 2019.01.30
5. 딕셔너리 기초 - (1)  (0) 2019.01.29
3. String -(2) : string 함수  (0) 2019.01.24
3. String - (1)  (0) 2019.01.22
2. 간단한 숫자 자료형과 해당 형식 지정자  (0) 2019.01.20

 저번에는 String의 인덱스와 슬라이싱까지 살펴 보았는데 해당 부분이 스트링에서 가장 중요한 부분이라고 보시면 됩니다. 그리고 Numpy와 Pandas에서도 자주 사용되는 부분이니 잘 살펴보시기 바랍니다. 나중에 복습하셔도 상관없겠죠.

 이번에는 string을 다룰 떄 사용하는 각종 함수에 대해서 살펴 보도록 하겠습니다. 제 목표는 어차피 Numpy, Pandas 등의 라이브러리를 사용하는 것이기 떄문에 간단한 함수만 짚고 넘어가도록 하겠습니다. Join, Reverse 같은 함수들을 살펴 볼 텐데, String을 다룰 때 자주 사용되는 함수 입니다.

 

그러면 Coding을 시작 해 보도록 하겠습니다.

 

1. Replace

먼저 가장 자주 쓰이는 Replace 함수를 코딩 해 봤습니다. 해당 함수의 기본적인 사용법은 간단합니다.

변수.Repace("Old value","New value")

변수에서 로 바꿀 값(Old value)을 새로운 값(New value)로 치환하는 것 입니다.

 

 

 

 

그러면 다음과 같이 만약에 특수 문자나 어떤 바꾸고 싶은 값이 이전에 있을 경우에 원래 값으로 되돌릴 수가 있겠죠? replace는 주로 이럴 경우에 사용하는 함수입니다. 하지만 숫자를 주로 취급하는 저는 잘 사용하지를 않습니다 나중에 숫자랑 String이랑 마구잡이로 뒤섞인 데이터를 다뤄야 할 경우에는 이런 함수도 다뤄야 하겠지만요.

 

하지만 주의해야 할 점이 있는데 replace는 string형태에서만 작동한다는 점입니다. 위의 에러 메세지를 참고 하시면 알 수 있으실 겁니다. 나중에 학습하겠지만 여러가지 자료를 저장 할 수 있는 리스트의 경우도 내용이 String (' '로 둘러 싸여 있는 것)이 아니면 replace나 다른 함수들을 사용 할 수 없겠죠?

 

2. Split

 

문자열을 배열, list로 나눠주는 함수입니다. 글자 string을 list로 나눠주는 함수입니다. 이를 코딩하여 보면,

 

위와 같이 ()안에 아무것도 쓰지 않으면 공백(스페이스, 탭)을 기준으로 배열을 생성하고, 따로 구분기호를 주면 그것을 기준으로 배열을 생성합니다. 만약에 구분기호가 문자열 내부에 없으면 그냥 string을 통째로 리스트안에 집어 넣습니다. (여기에는 까먹고 따로 첨부하지 못했는데

 

IN string = seoulcity

IN string.split("a")

OUT ['seoulcity']

위와 같이 a로 seoulcity를 나눌 수 없기 때문에 'seoulcity'가 통쨰로 리스트 안에 들어 갑니다.

 


추가(2019.02.20) - Split option

K O R E A 스트링을 split(" " ,3) 하면 , 앞에 3글자, K O R 을 리스트에 넣고, 나머지 EA를 리스트에 넣어서 [K, O, R, EA]라는 리스트를 생성한다.  

3.  Join

split함수가 문자열을 리스트로 만들어 주는 함수였다면 join함수는 리스트를 문자열로 만들어 주는 함수입니다. 기본적인 사용법으로 그냥 문자열 사이사이에 특정 string을 입력하는 사용법도 있지만 그것보다는 주로 문자열을 리스트로 만들어주는데 사용합니다. 기본적인 사용법은 위키 피디아를 참조 하였습니다.

https://wikidocs.net/13

 

 

 

 

 기본적으로 string들 사이사이에 구분자(delimiter)를 넣어서 사용하는 방법입니다. abcd가 구분자 ','로 나뉘어 a,b,c,d가 되었음을 알 수 있습니다. 이건 csv와 같이 comma로 나뉘어진 파일로 사용하고 싶을 때 사용 할 수 있겠죠?

 그리고 아까 Join이 Split의 반대 격이라고 말씀 드렸는데 Split이 문자열을 리스트로 나눴다면 join은 리스트를 구분자를 받아서 문자를 합치는 기능을 합니다. 구분자로는 특수 기호를 넣을 수도 있지만 아예 아무것도 안 넣을 수도 있고 공백을 넣을 수도 있습니다.

공백을 넣을 경우에 life is good으로 문자열을 출력하는 것이 가능하겠죠.  

 

 

Replace와 Join외에 자주 쓰는 함수로는 Count, Index, find등이 있지만 사용법이 쉬워서 굳이 언급하지 않고 넘어가도록 하겠습니다.  (사용법은 위키피디아 참조)

 

 

 

다음부터는 파이썬의 주요 자료형인 리스트 그리고 딕셔너리 등으로 찾아오도록 하겠습니다!

+ Recent posts