티스토리 뷰
Python은 벡터 연산이 불가능합니다.
AttributeError: 'list' object has no attribute 'methodName'
이러한 오류가 출력되는 것은, 벡터 연산이 불가능한 메서드(method)에 리스트를 적용했기 때문이죠.
이를 해결하기 위해서는 "사용자 정의 함수 + 적용 함수" 의 조합이 필요합니다.
# test 변수 준비
>>> im = 'im tired'
#. startswith() : 문자열의 시작 문자 패턴 확인 (T or F return)
>>> im
'im tired'
>>> im.startswith('im')
True
#. endswith() : 문자열의 종료 문자 패턴 확인 (T or F return)
>>> im
'im tired'
>>> im.endswith('ed')
True
#. find() : 문자열의 특정 패턴 위치 검색 (문자의 위치 return)
>>> im
'im tired'
>>> im.find('t')
3 # 파이썬의 위치는 '0'부터 시작
>>> im.find('o') # 특정 문자가 포함되지 않는 경우 -1
-1
>>> im.find('ed')
6
#. rfind() : 문자열의 오른쪽(뒤)에서부터 패턴 위치 검색 (문자의 위치 return)
>>> im
'im tired'
>>> 'abcbcacb'.rfind('a') # 문자열에서 특정 문자의 중복 시, 찾고자하는 문자가 뒤에 위치할 경우 사용
5
>>> 'abcbcacb'.find('a') # find 메서드와 방향의 차이
0
#. count() : 문자열의 특정 문자 빈도 수
>>> im
'im tired'
>>> im.count('i')
2
#. strip() : trim 과 동일한 문자열의 양쪽 공백 제거 메서드
>>> ' space '.strip()
'space'
>>> 'ssssxsspacesssss'.strip('s') # 공백 제거 뿐 아니라 문자 제거도 가능
'xsspace' # 단, 타 문자 사이에 있는 문자는 불가능 -> replace method 사용
#. lstrip() : 문자열의 왼쪽 공백 제거
>>> ' space '.lstrip()
'space '
>>> 'ssssxspace'.lstrip('s') # 마찬가지로 문자 제거도 가능
'xspace'
#. rstrip() : 문자열의 오른쪽 공백 제거
>>> ' space '.rstrip()
' space'
>>> 'spacesssss'.rstrip('s')
'space'
#. isalpha() : 문자열이 알파벳으로만 이루어져 있는지 검사
>>> im
'im tired'
>>> im.isalpha()
False # 공백을 포함하므로 False
>>> 'imtired'.isalpha()
True
#. isnumeric() : 문자열이 숫자로만 이루어져 있는지 검사
>>> '1234'.isnumeric()
True
>>> '1.234'.isnumeric()
False # .(기호)을 포함 하므로 False
#. isalnum() : 문자열이 알파벳과 숫자로만 이루어져 있는지 검사
>>> 'alpa1234'.isalnum()
True
>>> 'alpa 1234'.isalnum()
False # 공백 및 특수기호를 포함하면 False
#. replace() : 문자열의 특정 문자 치환
>>> 'a-b-c-d'.replace('-','')
'abcd'
#. split() : 특정 문자 기준 문자열 분리 (list return)
>>> 'a-b-c-d'.split('-')
['a', 'b', 'c', 'd']
>>> 'a-b-c-d'.split('-')[2] # 색인 가능
'c'
>>> 'Aaron@tistory.com'.split('@')
['Aaron', 'tistory.com']
>>> 'Aaron@tistory.com'.split('@')[0]
'Aaron'
#. upper() : 문자열을 대문자로 치환
>>> im
'im tired'
>>> im.upper()
'IM TIRED'
#. lower() : 문자열을 소문자로 치환
>>> im
'im tired'
>>> im.lower()
'im tired'
#. format() : 출력 format 설정
(format()은 벡터 연산이 불가능하고 , 어차피 lambda에서 간단하게 사용 가능하기 때문에 자주 사용하지 않음)
>>> 'Im {0} hungry {1} tired. {2:d}'.format('very', 'and', 10)
'Im very hungry and tired. 10'
>>> 'Im {how} hungry {another} tired.'.format(how='very', another='and')
'Im very hungry and tired.'
#. Q1
# 1. ename = ['smith','allen','king'] 에서 s로 시작하는 이름 확인
>>> ename = ['smith','allen','king']
>>> f1 = lambda x : x.startswith('s')
>>> list(map(f1,ename))
[True, False, False]
# 2. jumin = ['8812111223928','8905042323343','90050612343432'] 에서 성별출력
>>> jumin = ['8812111223928','8905042323343','90050612343432']
>>> f2 = lambda x : x[6] # python은 벡터연산이 불가하므로 substring을 사용하지 않음 -> 색인 사용
>>> list(map(f2,jumin))
['1', '2', '1']
# 3. sal = ['3,000','4,500','7,000'] 에서 10% 인상 연봉 출력
>>> sal = ['3,000','4,500','7,000']
>>> f3 = lambda x : round(int(x.replace(',',''))*(1.1))
>>> list(map(f3,sal))
[3300, 4950, 7700]
# 4. ename에서 smith 또는 allen 확인
>>> ename
['smith', 'allen', 'king']
>>> f4 = lambda x : x in ['smith','allen']
>>> list(map(f4,ename))
[True, True, False]
#. Q2
>>> l1=['서울','부산','대전','전주']
>>> l2=['2007(1)','2007(2)','2007(3)','2007(4)']
>>> l3=['02)345-4958','031)334-0948','055)394-9050','063)473-3853']
>>> l4=['ab/cs','csct/t']
### 1. l1의 값에 "시"를 붙여 출력
>>> f1 = lambda x : x + '시'
>>> list(map(f1,l1))
['서울시', '부산시', '대전시', '전주시']
### 2. 데이터를 불러왔더니 컬럼명이 l2과 같은 형태로 변형되었을 경우 각각 년도와 분기를 분리하여 출력
# 기존 => 년도 분기
# 2007(1) 2007 1
# 2007(2) 2007 2
# 2007(3) 2007 3
# 2007(4) 2007 4
# sol 1)
>>> f2 = lambda x : x[0:4]
>>> list(map(f2,l2))
['2007', '2007', '2007', '2007']
>>> f2_1 = lambda x : x[5]
>>> list(map(f2_1,l2))
['1', '2', '3', '4']
# sol 2)
>>> f2 = lambda x : x[0:4] + ' ' +x[5]
>>> list(map(f2,l2))
['2007 1', '2007 2', '2007 3', '2007 4']
### 3. 다음과 같이 국번 XXX 치환 (02)345-4958 => 02)XXX-4958)
# sol 1)
>>> f3 = lambda x : x.replace(x[x.find(')')+1:x.find(')')+4],'XXX')
>>> list(map(f3,l3))
['02)XXX-4958', '031)XXX-0948', '055)XXX-9050', '063)XXX-3853']
# sol 2)
>>> f3 = lambda x : x.replace(x.split(')')[1].split('-')[0], 'XXX')
>>> list(map(f3,l3))
['02)XXX-4958', '031)XXX-0948', '055)XXX-9050', '063)XXX-3853']
### 4. 각 문자열에서 /기호와 함께 쓰이는 패턴만 추출 => /?
>>> f4 = lambda x : x[x.find('/') : x.find('/')+2]
>>> list(map(f4,l4))
['/c', '/t']
'Python > Process' 카테고리의 다른 글
[Python] 리스트 (list) (0) | 2019.01.25 |
---|---|
[Python] 반복문(for, where, 무한루프, break, continue, pass, next) (0) | 2019.01.25 |
[Python] 조건문(if, ifelse, elseif) (0) | 2019.01.24 |
[Python] 사용자 정의 함수 및 적용 함수(def, lambda, map) (0) | 2019.01.23 |
[Python] 파이썬 기초(변수, 출력, 모듈, 연산, 문자열) (0) | 2019.01.22 |