티스토리 뷰

반응형

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']



반응형
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday