지난번 포스팅에서는 파이썬에서 단일 데이터를 다루는 자료형인 숫자와 문자열에 대해서 알아보았습니다. 


파이썬에는 다수의 데이터를 다룰 수 있는 자료형으로 리스트(List), 튜플(Tuple), 사전(Dictionary) 자료형이 있습니다.  

이번 포스팅에서는 이중에서 리스트(List) 자료형에 대해서 알아보겠습니다. 


리스트(List) 자료형은 다수 데이터가 서로 다른 형태의 자료여도 되며, 변경 가능하다는 점 때문에 데이터 분석에서 정말 많이 사용는 만큼, 정말 중요한 자료형입니다.  (↔ 튜플은 자료 갱신이 안됨)


리스트(List)는 대괄호(square brackets, [ ]) 을 사용해서 자료값을 감싸주고, 대괄호 안의 다수의 값들은 콤마(comma)로 구분을 해줍니다. 



[ 파이썬의 5가지 자료형 (Python's 5 Data Types) ]





먼저 리스트 생성, 삭제, 인덱싱 및 슬라이싱, 기본 연산자를 소개하고, 리스트를 다루는 내장 함수와 메소드는 다음번에 나누어서 설명하겠습니다. 



 1. 대괄호와 콤마로 리스트 생성 (creating a list with square brackets and comma separation)


리스트 안에 문자열, 정수, 부동소수형, 리스트, 튜플 등 다양한 형태의 자료들이 들어갈 수 있으며, 콤마로 구분해주고, 대괄호로 감싸줍니다.  



# List : contains items separated by commas and enclosed within square brackets([])

>>> list_1 = ['abc', 123, 3.14, ['edf', 456], ('gh', 'st')]

>>> list_1

['abc', 123, 3.14, ['edf', 456], ('gh', 'st')]

 




  2. 리스트 삭제 (Deleting a list) : del



>>> list_1 = ['abc', 123, 3.14, ['edf', 456], ('gh', 'st')]

>>> list_1

['abc', 123, 3.14, ['edf', 456], ('gh', 'st')]

>>> 

>>> del list_1

>>> list_1

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

NameError: name 'list_1' is not defined

 




  3. 리스트 안의 특정 위치의 값을 새로운 값으로 갱신 (Updating a list) : list[index] = value



>>> list_1

['abc', 123, 3.14, ['edf', 456], ('gh', 'st')]

>>> list_1[1]

123

>>> list_1[1] = 111

>>> list_1

['abc', 111, 3.14, ['edf', 456], ('gh', 'st')]

 




  4. 리스트 인덱싱, 슬라이싱 (Indexing, Slicing a list)


리스트도 순서열(sequences)이므로, 문자열에서 사용했던 방법과 동일하게 인덱싱, 슬라이싱(indexing, slicing)이 가능합니다. 첫번째 자리는 '0'부터 인덱싱이 시작합니다. (R은 '1'부터 시작하므로 혼동하지 않도록 주의 요함)



# the slice operator : [:] with indexes starting at 0 in the beginning of the list

>>> list_1 = ['abc', 123, 3.14, ['edf', 456], ('gh', 'st')]

>>> list_1

['abc', 123, 3.14, ['edf', 456], ('gh', 'st')]

>>> 

>>> list_1[0]

'abc'

>>> list_1[0:3]

['abc', 123, 3.14]

>>> list_1[3:]

[['edf', 456], ('gh', 'st')]

 



마이너스 부호('-')를 붙여주면 뒤에서부터 인덱싱(indexing)이 시작합니다. 



>>> list_1 = ['abc', 123, 3.14, ['edf', 456], ('gh', 'st')]

>>> list_1

['abc', 123, 3.14, ['edf', 456], ('gh', 'st')]

>>> 

>>> list_1[-1] # indexing starting from the last using '-1' : minus (-) sign

('gh', 'st')

>>> list_1[-3:-1]

[3.14, ['edf', 456]]

 




  5. 리스트 기본 연산자 (Basic List Operations)


리스트의 기본 연산자(basic list operations)에는 리스트 길이는 재는 len() 함수, 리스트를 합치는 + 연산자, 리스트 값을 반복하는 * 연산자, 소속 여부 블리언값(True, False)을 반환하는 in 연산자, 함수를 반복하는데 사용하는 for loop 문 등이 있습니다. 


[ 리스트 기본 연산자 (basic list operations) ]


설명 (description)

파이썬 표현 (python expression)

결과 (results)

 리스트 길이 (length)

 len([1, 2, 3])

 3

 리스트 합치기 (concatenation)

 [1, 2, 3] + [4, 5, 6]

 [1, 2, 3, 4, 5, 6]

 반복 (repetition)

 [1, 2, 3]*3

 [1, 2, 3, 1, 2, 3, 1, 2, 3]

 소속 여부 (membership)

 1 in [1, 2, 3]

4 in [1, 2, 3]

 True

 False

 for loop 반복 (iteration)

 for x in [1, 2, 3]: print (x);

 1 

 2 

 3 




다음번 포스팅에서는 리스트 내장 함수 및 메소드에 대해서 알아보겠습니다. 


많은 도움이 되었기를 바랍니다. 


이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾸욱 눌러주세요. ^^



저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by R Friend R_Friend

지난번 포스팅에서는 파이썬 자료형식 중 '문자열(string)'에 특화된 내장 함수들인 다양한 문자열 메소드 (built-in string methods) 들에 대해서 알아보았습니다. 


이번 포스팅에서는 문자열에 특화된 연산자, 메소드로서 


- 형식을 갖춘 문자열을 만들어주는 연산자: %


- 형식을 갖춘 문자열을 만들어주는 메소드: format() 


에 대해서 알아보겠습니다. 


텐서플로우로 딥러닝 공부하다보면 제일 마지막 부근에 아래와 같은 모델 훈련 진행 경과를 확인하는 코드가 들어있습니다. 이번 포스팅이 보고 나면 아래의 코드가 무엇을 의미하는지 눈에 읽히기 시작할 것입니다. ^^



# 신경망 모델 학습 진행 경과 확인 python code


print('Epoch:', '%04d' % (epoch + 1),

         'Avg. cost =', '{:.3f}'.format(total_cost / total_batch))

 



처음에 문자열 형식(format)을 설정해주는 % 연산자와 format() 문자열 메소드를 봤었을 땐 생소하고, 해석이 안되서 좀 당황했었습니다. 그런데 파이썬 매뉴얼 보고 나서 의미를 파악하고 난 후, 그리고 요즘 텐서플로우로 딥러닝 공부하면서 코드를 자꾸 보다보니 이젠 익숙해지기도 하고, 많이 유용하다는 생각도 듭니다. 



[ Python String Formatting Operator % and Method format() ]




간단한 예를 들어서 설명해보겠습니다. 


 (1) Format 을 갖춘 문자열을 만들어주는 연산자 (String Formatting Operator): %



>>> "I am %s and %d years old" %('Mr.Hong', 40)

'I am Mr.Hong and 40 years old'

 



'%'의 뒤에 함께 사용할 수 있는, 문자열 형식을 지정해주는 symbol 들에는 아래와 같은 것들이 있습니다. 많이 사용할 만한 format symbol은 파란색으로 강조를 했습니다.  (%i, %d, %u 는 차이가 뭔지 잘 모르겠네요 ^^;)


%와 함께 사용하는 형식 기호

(Format Symbol with %) 

변환 (Conversion)

 %c

 문자 (character)

 %s

 str() 메소드를 사용해서 문자열로 변환한 후 formatting

%i 

 부호가 있는 십진법 정수 (signed decimal integer)

 %d

 부호가 있는 십진법 정수 (signed decimal integer)

 %u

 부호가 없는 십진법 정수 (unsigned decimal integer)

 %o

 8진법 정수 (octal integer)

 %x

 소문자의 16진법 정수 (hexadecimal integer, lowercase letters)

 %X

 대문자의 16진법 정수 (hexadecimal integer, UPPERcase letters)

 %e

 소자 'e'를 사용한 지수 표기 (exponential notation with lowercase 'e')

 %E

 대문자 'E'를 사용한 지수 표기 (exponential notation with UPPERcase 'E')

 %f

 부동소수형 실수 (floating point real number)

 %g

 %f(부동소수형 실수)와 %e (소문자 'e' 지수 표기) 의 단축형 표기

 %G

 %f(부동소수형 실수)와 %E(대문자 'E' 지수 표기)의 단축형 표기




위의 Format Symbol을 사용하면 원하는 Format의 데이터가 아닐 경우 'TypeError' (예: TypeError: %d format: a number is required, not str) 가 납니다. 



>>> "I am %s and %d years old" %('Mr.Hong', '40')  # '40' is not a number, but a string

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

TypeError: %d format: a number is required, not str

 




부호가 있는 십진법 정수를 나타내는 문자열 포맷 연산자인 %d 의 경우 아래의 "%04d" % (5) 처럼 '%'와 'd' 사이에 '0'과 '숫자'를 써주게 되면 => % ( ) 안의 십진수 정수가 만약 입력한 '숫자'(예에서는 '4') 만큼의 총 자리수보다 작다면 그 모자라는 만큼을 '0'으로 채워줍니다. 말로 설명하기가 쉽지 않은데요(^^;), 아래의 예시를 보면 이해가 쉬울 것 같습니다. 



>>> "%04d" % (5)

'0005'

>>> "%04d" % (55)

'0055'

>>> "%04d" % (555)

'0555'

>>> "%04d" % (5555)

'5555'

>>> "%04d" % (55555)

'55555'

 




부동소수형 실수를 나타내는 문자열 포맷 연산자인 %f 의 경우 아래의 "%.3f" % (0.5) 처럼 '%'와 'f' 사이에 점 '.'과 '숫자'를 써주게 되면 => % ( ) 안의 부동소수형 실수가 만약 입력한 '숫자' (예에서는 '3') 만큼의 총 소수점 자리수보다 작다면 뒷부분의 모자라는 만큼을 '0'으로 채워줍니다.  역시, 글로 설명을 들으면 어려운데요(^^;), 아래 예를 살펴보시기 바랍니다. 



>>> "%.3f" % (5)

'5.000'

>>> "%.3f" % (0.5)

'0.500'

>>> "%.3f" % (0.55)

'0.550'

>>> "%.3f" % (0.555)

'0.555'

>>> "%.3f" % (0.5555)

'0.555'

 




처음 시작할 때 예로 들었던 딥러닝 텐서플로우 코드의 말미에 있다는 파이썬 코드가 이제 눈어 들어올 것입니다. epoch 와 total_cost, total_batch 변수에 임의의 숫자를 넣어서 아래에 print 를 해보았습니다. 



>>> print('Epoch:', '%04d' % (100),

...       'Avg. cost =', '{:.3f}'.format(10 / 1000))

Epoch: 0100 Avg. cost = 0.010

 





 (2) Format 을 갖춘 문자열을 만들어주는 메소드 (String Formatting Method): format()


format() 메소드를 사용해서 형식을 갖춘 문자열을 만드는 방법에는 두 가지가 있습니다. 


(2-1) 먼저 대괄호 { } 안에 변수 이름(variable name)을 지정해주고, format(variable name = value) 처럼 값을 지정해주는 방법입니다.  대괄호 { } 안에 문자열 형식을 지정할 변수가 많다면 명시적으로 변수명을 설정해주기 때문에 헷갈리지도 않고 코드 가독성도 높여주는 방법입니다. 



>>> "I am {name} and {age} years old".format(name='Mr.Hong', age=40)

'I am Mr.Hong and 40 years old'




format() 메소드 안에 값을 입력해줄 때 변수명별로 대입해서 입력하기 때문에 순서와는 상관이 없습니다. 



>>> "I am {name} and {age} years old".format(age=40name='Mr.Hong')

'I am Mr.Hong and 40 years old'

 




(2-2) 두번째 방법은 대괄호 { } 안에 문자열 입력하는 순서대로 데이터를 넣어주면 지정한 포맷대로 문자열을 만들어주는 방법입니다. 



>>> "I am {0} and {1} years old".format('Mr.Hong', 40)

'I am Mr.Hong and 40 years old'

 



format() 메소드 안에 값을 입력하는 순서가 바뀌면 출력되는 문자열에 입력하는 값이 의도했던 바와는 다르게 실수로 뒤엉커버릴 수 있습니다. 따라서 대괄호 { }로 포맷을 설정할 변수가 많은 경우에는 실수를 유발할 위험이 있는 방법이니, 첫번째처럼 명시적으로 변수명을 지정해주는게 좋겠습니다. 



>>> "I am {0} and {1} years old".format(40, 'Mr.Hong') # sequence matters

'I am 40 and Mr.Hong years old'

 

 


많은 도움이 되었기를 바랍니다. 


이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾸욱 눌러주세요. ^^



저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by R Friend R_Friend

지난번 포스팅에서는 파이썬의 자료 유형인 

 - 숫자(Number), 

 - 문자열(String), 

 - 리스트(List), 

 - 튜플(Tuple), 

 - 사전(Dictionary) 


중에서 먼저 숫자(Number)와 문자열(String)의 기본 사용법을 소개하였습니다. 


이번 포스팅에서는 지난 포스팅에 이어서 문자열에 특화되어 문자열 자료형을 다양하게 처리할 수 있는 함수인 문자열 메소드(String Methods) 에 대해서 알아보겠습니다. 


문자열 메소드를 숙지하고 있으면 동일한 목적의 문자열 전처리를 위해 직접 프로그래밍을 하는 것보다 문자열 메소드를 사용한 1~2줄의 코드면 해결되므로 업무 효율도 오르고, for loop 문을 쓰는 것보다 속도도 훨씬 빠릅니다. 


[참고]  메소드 (Method)


내장 함수(Built-in Function)와는 달리 문자열 자료형과 같이 특정 자료형이 가지고 있는 함수를 메소드(Method) 라고 합니다. 메소드는 객체 지향 프로그래밍의 기능에 대응하는 파이썬 용어입니다. 함수와 거의 동일한 의미이지만 메소드는 클래스의 멤버라는 점이 다릅니다. 



평소에 공부해놓고 '아, 문자열 메소드에 이런 기능이 있었지!' 정도는 기억해놓고 있어야 바로 찾아서 쓰기 쉽겠지요? 아래에 문자열 메소드들을 기능에 따라서 그룹핑을 해보았는데요, 저의 경우 len(), find(), lower(), upper(), lstrip(), rstrip(), split(), splitlines(), replace(), join(), zfill() 등을 종종 사용하는 편이네요. 



[ 파이썬 문자열 메소드 (String Methods in Python) ]



이번 포스팅은 https://www.tutorialspoint.com/python/python_strings.htm  사이트에 있는 영문 소개자료를 참고하여 작성하였습니다. 문자열 메소드의 기능 설명만 되어 있어서 좀더 이해하기 쉽도록 예제를 추가로 만들어보았습니다. 

expandtabs(), maketrans() 등 일부 메소드는 제가 써본적도 없고 앞으로 거의 쓸 일이 없을 것 같아서 주관적으로 판단해서 몇 개 빼고 소개하는 것도 있습니다. 


하나씩 예을 들어 살펴보겠습니다. 




1. 문자열 계산 관련 메소드 (String methods based on calculation)


len() : 문자열 길이



# len() : Returns the length of the string

>>> a = 'I Love Python'

>>> len(a)

13

 



 min(), max() : 문자열 내 문자, 혹은 숫자의 최소값, 최대값 (알파벳 순서, 숫자 순서 기반)



# max(str), min(str) : Returns the max, min alphabetical character from the string str

>>> d = 'abc'

>>> f = '123'

>>> 

>>> min(d)

'a'

>>> max(d)

'c'

>>> 

>>> min(f)

'1'

>>> max(f)

 



 count() :  문자열 안에서 매개변수로 입력한 문자열이 몇 개 들어있는지 개수를 셈 

                (begin, end 위치 설정 가능)



# count() : Counts how many times str occurs in string

>>> a = 'I Love Python'

>>> a.count('o')

2

>>> 

>>> a = 'I Love Python'

>>> a.count('o', 7, len(a)) # count(string, begin, end)

1

>>> 

>>> a.count('k') # there is no 'k' character in 'a' string

0

 





2. 문자열에 특정 문자 들어있는지 여부, 어디에 위치하고 있는지 찾아주는 메소드


  startswith() : 문자열이 매개변수로 입력한 문자열로 시작하면 True, 그렇지 않으면 False 반환



# startswith(): Determines if string or a substring of string

>>> a = 'I Love Python'

>>> a.startswith('I')

True

>>> a.startswith('I Lo')

True

>>> a.startswith('U')

False

 



  endswith() : 문자열이 매개변수로 입력한 문자열로 끝나면 True, 그렇지 않으면 False 반환



# endswith(): Determines if string or a substring of string

>>> a = 'I Love Python'

>>> a.endswith('Python')

True

>>> a.endswith('Pycham')

False

 



 find() : 문자열에 매개변수로 입력한 문자열이 있는지를 앞에서 부터 찾아 index 반환, 없으면 '-1' 반환



# find() : Search forwards, Determine if str occurs in string and return the index

>>> a = 'I Love Python'

>>> a.find('o')

3

>>> a.find('k') # if there is no string, then '-1'

-1

 



  rfind() : 문자열에 매개변수로 입력한 문자열이 있는지를 뒤에서 부터 찾아 index 반환, 없으면 '-1' 반환



# rfind() : Same as find(), but search backwards in string

>>> a = 'I Love Python'

>>> a.rfind('o')

11

 



 index() :  find()와 기능 동일하나, 매개변수로 입력한 문자열이 없으면 ValueError 발생



# index(): Same as find(), but raises an exception if str not found

>>> a = 'I Love Python'

>>> a.index('o')

3

>>> a.index('k') # ValueError: substring not found

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

ValueError: substring not found

 



 rindex() : index()와 기능 동일하나, 뒤에서 부터 매개변수의 문자열이 있는지를 찾음



# rindex(): Same as index(), but search backwards in string

>>> a = 'I Love Python'

>>> a.rindex('o')

11

>>> a.rindex('k') # ValueError: substring not found

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

ValueError: substring not found

 





3. 숫자, 문자 포함 여부 확인하는 메소드


  isalnum() : 문자열이 알파벳과 숫자로만 이루어졌으면 True, 그렇지 않으면 False



>>> a = 'I Love Python'

>>> d = 'abc'

>>> e = '123abc'

>>> f = '123'

>>> 

# isalnum() : Returns true if string has at least 1 character and 

#                  all characters are alphanumeric and false otherwise

>>> a.isalnum() # False

False

>>> d.isalnum() # True

True

>>> e.isalnum() # True

True

>>> f.isalnum() # True

True




  isalpha() : 문자열이 알파벳(영어, 한글 등)으로만 이루어졌으면 True, 그렇지 않으면 False



>>> a = 'I Love Python'

>>> d = 'abc'

>>> e = '123abc'

>>> f = '123'

>>> 

# isalpha() : Returns true if string has at least 1 character 

#                 and all characters are alphabetic and false otherwise

>>> a.isalpha() # False (there is space between characters)

False

>>> d.isalpha() # True

True

>>> e.isalpha() # False

False

>>> f.isalpha() # False

False




  isdigit() : 문자열이 숫자만 포함하고 있으면 True, 그렇지 않으면 False, isnumeric()과 동일



>>> a = 'I Love Python'

>>> d = 'abc'

>>> e = '123abc'

>>> f = '123'

>>> 

# isdigit() : Returns true if string contains only digits and false otherwise

>>> a.isdigit() # False 

False

>>> d.isdigit() # False

False

>>> e.isdigit() # False

False

>>> f.isdigit() # True

True




  isnumeric() : 문자열이 숫자로만 이루어져 있으면 True, 그렇지 않으면 False, isdigit()과 동일



>>> a = 'I Love Python'

>>> d = 'abc'

>>> e = '123abc'

>>> f = '123'

>>> 

# isnumeric(): Returns true if a unicode string contains only numeric characters

>>> a.isnumeric() # False

False

>>> d.isnumeric() # False

False

>>> e.isnumeric() # False

False

>>> f.isnumeric() # True

True

 



  isdecimal() : 문자열이 10진수 문자이면 True, 그렇지 않으면 False



>> a = 'I Love Python'

>>> d = 'abc'

>>> e = '123abc'

>>> f = '123'

>>> 

# isdecimal(): Returns true if a unicode string contains only decimal characters

>>> a.isdecimal() # False

False

>>> d.isdecimal() # False

False

>>> e.isdecimal() # False

False

>>> f.isdecimal() # True 

True

 





4. 대문자, 소문자 여부 확인하고 변환해주는 문자열 메소드


  islower() : 문자열이 모두 소문자로만 되어있으면 True, 그렇지 않으면 False



>>> a = 'I Love Python'

>>> g = 'i love python'

>>> h = 'I LOVE PYTHON'

>>> 

# islower(): Returns true if string has at least 1 cased character 

#            and all cased characters are in lowercase and false otherwise

>>> a.islower() # False

False

>>> g.islower() # True

True

>>> h.islower() # False

False

 



  isupper() : 문자열이 모두 대문자로만 되어있으면 True, 그렇지 않으면 False



>>> a = 'I Love Python'

>>> g = 'i love python'

>>> h = 'I LOVE PYTHON'

>>> 

# isupper(): Returns true if string has at least one cased character 

#           and all cased characters are in uppercase and false otherwise

>>> a.isupper() # False

False

>>> g.isupper() # False

False

>>> h.isupper() # True

True

 



  lower() : 문자열 내 모든 대문자를 모두 소문자(a lowercase letter)로 변환



>>> a = 'I Love Python'

>>> 

# lower(): Converts all uppercase letters in string to lowercase

>>> a.lower()

'i love python'




 upper() :  문자열 내 모든 소문자를 모두 대문자(a uppercase letter)로 변환



>>> a = 'I Love Python'

>>> 

# upper(): Converts lowercase letters in string to uppercase

>>> a.upper()

'I LOVE PYTHON'

 



 swapcase() : 문자열 내 소문자는 대문자로 변환, 대문자는 소문자로 변환



# swapcase(): Inverts case for all letters in string

>>> a = 'I Love Python'

>>> a.swapcase() # 'i lOVE pYTHON'

'i lOVE pYTHON'

>>> 

>>> g = 'i love python'

>>> g.swapcase() # 'I LOVE PYTHON' (same as upper())

'I LOVE PYTHON'

>>> 

>>> h = 'I LOVE PYTHON'

>>> h.swapcase() # 'i love python' (same as lower())

'i love python'

 



  istitle() : 문자열이 제목 형식에 맞게 대문자로 시작하고 이후는 소문자이면 True, 그렇지 않으면 False



>>> a = 'I Love Python'

>>> g = 'i love python'

>>> h = 'I LOVE PYTHON'

>>> 

# istitle(): Returns true if string is properly "titlecased" and false otherwise

>>> a.istitle() # True

True

>>> g.istitle() # False

False

>>> h.istitle() # False

False

 



 title() : 문자열을 제목 형식(titlecased)에 맞게 시작은 대문자로, 나머지는 소문자로 변환 



>>> g = 'i love python'

>>> h = 'I LOVE PYTHON'

>>> 

# title(): Returns "titlecased" version of string, that is, 

#          all words begin with uppercase and the rest are lowercase

>>> g.title() # 'I Love Python'

'I Love Python'

>>> h.title() # 'I Love Python'

'I Love Python'

 



  capitalize)=() : 문자열 내 첫번째 문자를 대문자로 변환하고, 나머지는 모두 소문자로 변환



>>> a = 'I Love Python'

>>> g = 'i love python'

>>> h = 'I LOVE PYTHON'

>>> 

# capitalize(): Capitalizes first letter of string

>>> a.capitalize() # 'I love python'

'I love python'

>>> g.capitalize() # 'I love python'

'I love python'

>>> h.capitalize() # 'I love python'

'I love python'

 





5. 공백 존재 여부 확인 및 처리하기 문자열 메소드 


 lstrip() : 문자열의 왼쪽에 있는 공백을 제거



# lstrip() : Removes all leading whitespace in string

>>> b = '      I Love Python'

>>> b.lstrip()

'I Love Python'




  rstrip() : 문자열의 오른쪽에 있는 공백을 제거



# rstrip() : Removes all trailing whitespace of string

>>> c = 'I Love Python      '

>>> c.rstrip()

'I Love Python'

 



  strip() : 문자열의 양쪽에 있는 공백을 제거



# strip() : Performs both lstrip() and rstrip() on string

>>> '     I Love Python     '.strip()

'I Love Python'

 



  isspace() : 문자열이 단지 공백(whitespace)으로만 되어있을 경우 True, 그렇지 않으면 False



# isspace(): Returns true if string contains only whitespace characters and false otherwise

>>> i = '     '

>>> j = '      I Love Python'

>>> 

>>> i.isspace() # True

True

>>> j.isspace() # False

False

 



  center(width) : 총 길이가 매개변수로 받는 문자열폭(width)만큼 되도록 공백을 추가하여 중앙 정렬



# center(): Returns a space-padded string with the original string 

#                centered to a total of width columns

>>> a = 'I Love Python'

>>> a.center(21)

'    I Love Python    '

 





6. 문자열을 나누고, 붙이고, 교체하고, 채우는 문자열 메소드 (split, join, replace, fill)


  split() : 문자열을 구분자(delimiter, separator) 기준에 따라 나누기


split()은 상당히 자주 사용하는 문자열 메소드 입니다. 



# split(): Splits string according to delimiter str (space if not provided) 

#    and returns list of substrings; split into at most num substrings if given

>>> x = 'haha, hoho, hihi'

>>> x.split(sep=',') # as a list ['haha', ' hoho', ' hihi']

['haha', ' hoho', ' hihi']




>>> ha, ho, hi = x.split(sep=',')

>>> ha

'haha'

>>> ho

' hoho'

>>> hi

' hihi'

 



>>> a = 'I Love Python'

>>> a.split(' ') # without arg 'sep='

['I', 'Love', 'Python']

>>> a.split() # default delimiter is space if not provided

['I', 'Love', 'Python'] 

 



  splitlines() : 여러개의 줄로 이루어진 문자열을 줄 별로 구분하여 리스트 생성



# splitlines(): returns a list with all the lines in string, 

#     optionally including the line breaks (if num is supplied and is true)

>>> y = 'haha, \nhoho, \nhihi'

>>> y

'haha, \nhoho, \nhihi'

>>> y.splitlines() # ['haha, ', 'hoho, ', 'hihi']

['haha, ', 'hoho, ', 'hihi']

 



 replace(old, new, max) : old 문자열을 new 문자열로 교체.  단, max 매개변수 있으면, max 개수 만큼만 교체하고 이후는 무시



# replace(old, new): Replaces all occurrences of old in string with new 

#        or at most max occurrences if max given

>>> a = 'I Love Python'

>>> a.replace('Python', 'R')

'I Love R'

>>> 

>>> 

>>> a_2 = 'I Love Python, Python, Python, Python, Python~!!!'

>>> a_2.replace('Python', 'R', 3) # str.replace(old, new, max)

'I Love R, R, R, Python, Python~!!!'




 join() :  여러개의 문자열을 구분자(separator) 문자열을 사이에 추가하여 붙이기


join()은 꽤 자주 쓰는 문자열 메소드 중의 하나입니다. 



# join(): Merges (concatenates) the string representations of elements 

#         in sequence seq into a string, with separator string

>>> mylist = ['I', 'Love', 'Python']

>>> print(mylist)

['I', 'Love', 'Python']

>>> 

>>> mystring = '_'.join(mylist)

>>> print(mystring) # 'I_Love_Python'

I_Love_Python

 



# To concatenate item in list to strings with join() method

>>> mylist_num = [1, 2, 3, 4, 5]

>>> print(mylist_num) # [1, 2, 3, 4, 5]

[1, 2, 3, 4, 5]

>>> 

>>> mylist_str = ''.join(map(str, mylist_num))

>>> print(mylist_str) # 12345

12345

>>> 

>>> '_'.join(map(str, mylist_num)) # '1_2_3_4_5'

'1_2_3_4_5'

 



 zfill(width) : 문자열을 매개변수 width만큼 길이로 만들되, 추가로 필요한 자리수만큼 '0'을 채움



# zfill(width): Returns original string leftpadded with zeros to a total of width characters; 

#      intended for numbers, zfill() retains any sign given (less one zero)

>>> f = '123'

>>> f.zfill(10)

'0000000123' 




 ljust(width[, fillchar]) : 문자열을 매개변수 width만큼 길이로 만들되, 왼쪽은 원본 문자열로 채우고, 

오른쪽에 추가로 필요한 자리수만큼 매개변수 fillchar 문자열로 채움



# ljust(): Returns a space-padded string with the original string left-justified 

#          to a total of width columns

# str.ljust(width[, fillchar])

>>> a = 'I Love Python'

>>> a.ljust(20, 'R')

'I Love PythonRRRRRRR'

 



 rjust(width[, fillchar]) : 문자열을 매개변수 width만큼 길이로 만들되, 오른쪽은 원본 문자열로 채우고, 

 왼쪽에 추가로 필요한 자리수만큼 매개변수 fillchar 문자열로 채움



# rjust(): Returns a space-padded string with the original string right-justified 

#          to a total of width columns

>>> a.rjust(20, 'R')

'RRRRRRRI Love Python'

>>> a.rjust(20, ' ')

'       I Love Python'

 



다음번 포스팅에서는 문자열의 포맷 메소드(string formatting opertor)에 대해서 알아보겠습니다. 


많은 도움 되었기를 바랍니다. 

이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾸욱 눌러주세요. ^^



저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by R Friend R_Friend

머신러닝, 딥러닝 연습할 때 책이나 블로그에서 가장 많이 사용되는 예제 데이터를 들라고 하면 아마도 손으로 쓴 숫자 '0~9' 이미지를 모아놓은 MNIST dataset 인것 같습니다.  훈련용으로 6만개, 테스트용으로 1만개 손 글씨 숫자 이미지 데이터가 들어있으니 연습하기에 제격입니다.  사이즈도 표준화 되어 있고, 가운데로 정렬도 잘 되어 있어서 훈련을 시키면 매우 높은 정확도로 훈련이 아주 잘 되지요. (실전 데이터도 과연? ㅎㅎ)


28x28 행렬에 숫자가 들어가 있구요, 이를 이미지로 그리면 손으로 쓴 숫자 글자가 됩니다.  아래 이미지는 이런 '0~9'까지의 손글씨 숫자들을 모아놓은 것입니다.  필체가 조금씩 다른데, 단번에 알아보기 쉬운 것도 있구요, 사람이 보기에도 헷갈리는 것들도 섞여 있습니다. 


[ 손으로 쓴 '0~9' 숫자들의 이미지 데이터 셋 MNIST ]




이번 포스팅에서는 tensorflow 설치 후 MNIST dataset을 사용하여 DNN 이나 CNN 연습해보려고 했더니 'SSL: CERTIFICATE_VERIFY_FAILED' 에러가 날 경우 조치 방법을 소개하겠습니다. 


제가 사용하는 환경은 아래와 같았는데요, 처음 MNIST dataset 다운로드 하려니 'SSL: CERTIFICATE_VERIFY_FAILED' 에러가 나더군요.  


 구분

버전/내용

[참고] terminal shell script 

 OS

 mac OS X 10.12.5

 

 Python

 3.6.1

# python 버전 확인

$ python3 --version

Python 3.6.1

 tensorflow

 1.2.1

# tensorflow 버전 확인

$ python3 -c 'import tensorflow as tf; print(tf.__version__)'

1.2.1

 CPU or GPU

 CPU

 

 설치/사용 환경

virtual env.

(가상환경)

# virtualenv (가상환경활성화 : activate

$ source /Users/Desktop/tensorflow/bin/activate


# 가상환경(virtual env.)에서 Jupyter Notebook 열기

$ jupyter notebook


구글링 해보니 아마도 Python 3.5 버전 이하로 설치를 했어야 했는데 3.6.1 최신 버전으로 설치하다 보니 에러가 난 것 같습니다.  Python 2.7 버전이나 Python 3.5 버전으로 재설치해보라는 답변이 있는 것으로 봐서는요. 



가상환경에서 Jupyter Notebook 띄우고, tensorflow importing 한 다음에, 아래 처럼 MNIST dataset 불러오는 script를 실행했더니 'SSL: CERTIFICATE_VERIFY_FAILED' 에러가 났습니다. 



# importing tensorflow

import tensorflow as tf

 

# mnist dataset loading

from tensorflow.examples.tutorials.mnist import input_data

mnist = input_data.read_data_sets("./mnist/data/", one_hot=True)



urllib.error.URLError: 
<urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749)>


Python 3.6.1을 그대로 사용하는 상태에서 MNIST dataset 다운로드 시 'SSL: CERTIFICATE_VERIFY_FAILED' 에러를 해결하려면 터미널에서 아래 bash script 를 실행시켜주면 됩니다. 



# solution for 'SSL: CERTIFICATE_VERIFY_FAILED' error (=> type in below bash script at terminal)

$ /Applications/Python\ 3.6/Install\ Certificates.command 

 


-- pip install --upgrade certifi

Requirement already up-to-date: certifi in /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages

 -- removing any existing file or link

 -- creating symlink to certifi certificate bundle

 -- setting permissions

 -- update complete





위 bash script로 certificate update 해주고 나니 tensorflow 에서 MNIST dataset 다운로드 제대로 되네요. 


== terminal 에서 가상환경 활성화 후 Jupyter Notebook 열고...


# virtualenv (가상환경활성화 : activate

$ source /Users/Desktop/tensorflow/bin/activate


# 가상환경(virtual env.)에서 Jupyter Notebook 열기

$ jupyter notebook 



* (주의사항) 가상환경(virtual env.) 에 python, tensorflow 설치한 분의 경우, Anaconda 에서 Jupyter notebook 을 열면 가상환경에 깔린 python 3.6.1, tensorflow를 Jupyter notebook이 인식 못해요. 가상환경에서 사용할 수 있도록 python 이랑 jupyter notebook 설치하고, 가상환경 활성화 한 후에 jupyter notebook 실행해서 tensorflow 사용하셔야 합니다. (Anaconda 사용하려면 conda 로 별도로 tensorflow setting 필요해요.)

(이걸 몰라서 왜 안되나 하고 한참을 애먹었네요. ㅜ_ㅜ)



== Jupyter Notebook 에서 tensorflow importing 하고 MNIST dataset 읽어오기


# importing tensorflow

import tensorflow as tf

 

# mnist dataset loading

from tensorflow.examples.tutorials.mnist import input_data

mnist = input_data.read_data_sets("./mnist/data/", one_hot=True) 


Extracting ./mnist/data/train-images-idx3-ubyte.gz

Extracting ./mnist/data/train-labels-idx1-ubyte.gz
Extracting ./mnist/data/t10k-images-idx3-ubyte.gz
Extracting ./mnist/data/t10k-labels-idx1-ubyte.gz



많은 도움 되었기를 바랍니다. 


이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾸욱 눌러주세요. 



저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by R Friend R_Friend


티스토리 툴바