[python] 자주사용되는 Built-In Functions과 활용예시 - ✨추가중
1.구두점 제거 방법
유효한 팰린드롬 를 공부하다가 문자열에서 구두점을 제거하는 여러가지 방법에 대해 정리 해보았습니다.
sentence = "A man, a plan, a canal: Panama"
1) 정규식 표현 이용
re.sub(r"[^\w]", "", sentence)
AmanaplanacanalPanama
2) maketrans(a, b) 이용
string.punctuation
를 출력해보면 !"#$%&'()*+,-./:;<=>?@[\]^_\
{|}~
의 구두점이 들어있는데 문자열에서 문자를 하나씩 추출하며 구두점이 아닌 문자만 out 변수에 저장합니다.
import string
out = ''.join([i for i in sentence if i not in string.punctuation])
print(out)
A man a plan a canal Panama
3) replace(t, “”) 이용
이 방법 또한 string.punctuation
를 이용하는데 구두점문자열을 하나씩 순회하며 문자열에 포함된 구두점은 공백으로 replace해주는 방법입니다.
temp = string.punctuation
for t in temp:
sentence = sentence.replace(t, "")
print(sentence)
A man a plan a canal Panama
4) isalnum() 이용
isalnum()
은 문자열이 알파벳([a-zA-Z])과 숫자([0-9])로만 구성되었는지 확인하는 파이썬 문자열 메소드입니다. 문자가 영문자 또는 숫자인 경우 True를 반환해줍니다. 이를 이용하여 영문자 또는 숫자인 문자열만 배열에 저장합니다.
out = ''.join([s for s in sentence if s.isalnum()])
print(out)
AmanaplanacanalPanama
2.is 와 == 의 차이
is는 id 주소값을 비교하는 함수이며 ==는 값을 비교하는 연산자입니다.
a = [1, 2, 3]
# 얕은 복사
b = a.copy()
# 깊은 복사
c = a
print('a와 b는 id가 다릅니다 : ', a is b)
print('a와 b는 값이 같습니다 : ', a == b)
print('a와 c는 id가 같습니다 : ', a is c)
3.locals()
- 클래스 메소드 내부의 모든 로컬 변수를 출력해 변수명을 일일이 찾아낼 필요 없이 잘못 선언된 부분이 없는지 확인하는 용도로 활용할 수 있습니다.
4.collections.deque()
- stack과 queue를 변형한 형태로 양쪽끝에서 추가(append)와 삭제(pop)가 가능합니다.
https://docs.python.org/3/library/collections.html#collections.deque
-
append
(x) : deque의 오른쪽에 x를 추가합니다. -
appendleft
(x) : 데크의 왼쪽에 x를 추가합니다. -
count
(x) : x 와 같은 데크 요소의 수를 셉니다. -
insert
(i, x) : x를 데크의 i 위치에 삽입합니다. -
pop
() : 데크의 오른쪽에서 요소를 제거하고 반환합니다. 요소가 없으면,IndexError
를 발생시킵니다. -
popleft
() : 데크의 왼쪽에서 요소를 제거하고 반환합니다. 요소가 없으면,IndexError
를 발생시킵니다. -
maxlen
: 데크의 최대 크기.설정하지 않으면 길이 변경됩니다.
5. strip(chars)
-
지정한 chars가 문자열 앞뒤에 존재할 경우 제거하여 반환해 줍니다.
strip(chars)
1) 공백 제거
sentence = ' a '
print(sentence.strip(' '))
## 실행결과
'''
a
'''
2) 문자 제거
sentence = ' a..a..'
print(sentence.strip('.'))
## 실행결과
'''
a..a
'''
3) lstrip() 선행문자만 제거
sentence = '..a..a..'
print(sentence.lstrip('.'))
## 실행결과
'''
a..a..
'''
4) rstrip() 후행문자만 제거
sentence = '..a..a..'
print(sentence.rstrip('.'))
## 실행결과
'''
..a..a
'''
6.zip
zip()
함수는 여러 개의 순회 가능한(iterable) 객체를 인자로 받고, 각 객체가 담고 있는 원소를 튜플의 형태로 차례로 접근할 수 있는 반복자(iterator)를 zip object 주소 값으로 반환합니다. 즉, 원소를 튜플의 형태만 만들어 놓고 list나 dict같은 iterable 함수로 감쌀때 실제 값을 만들어 메모리를 소비합니다
zip(["김","이","박"], "kim","Lee","Park")
## 실행결과
'''
<zip at 0x7f432deff6e0>
'''
1) iterable 객체 묶기
이때 주의할 점은 iterable 객체의 길이가 다르면 가장 짧은 인자를 기준으로 데이터를 묶고, 나머지는 버려집니다.
numbers = [1, 2, 3]
letters = ["A", "B", "C"]
for pair in zip(numbers, letters):
print(pair)
## 출력결과
'''
(1, 'A')
(2, 'B')
(3, 'C')
'''
만약에, zip 을 사용하지 않고 위와 같이 출력하려면 다음과 같이 구현해야 합니다.
numbers = [1, 2, 3]
letters = ["A", "B", "C"]
for i in range(3):
pair = (numbers[i], letters[i])
print(pair)
## 출력결과
'''
(1, 'A')
(2, 'B')
(3, 'C')
'''
2) literable 객체를 list로 만들기
튜플로 묶어주는 것을 list로 담을 수 있습니다.
numbers = [1, 2, 3]
letters = ["A", "B", "C"]
num_letters = list(zip(numbers, letters))
print(num_letters)
## 출력결과
'''
[(1, 'A'), (2, 'B'), (3, 'C')]
'''
3) iterable 객체를 dictionary로 만들기
list대신에 dictionary 로 담으면 손쉽게 dictionary를 만들 수 있습니다.
numbers = [1, 2, 3]
letters = ["A", "B", "C"]
num_letters = dict(zip(numbers, letters))
print(num_letters)
## 출력결과
'''
{1: 'A', 2: 'B', 3: 'C'}
'''
4) 별표(*)사용 : 2차원배열을 세로단위로 묶기
2차 배열에 대해 zip(*2차배열)
와 같이 *을 붙여서 인자값으로 설정하면, 각 행의 열값을 묶어줍니다. 이를 list로 변환해서 사용합니다.
test = [[1,2,3], [2,3,4], [9,8,7]]
list(zip(*test))
## 출력결과
'''
[(1, 2, 9), (2, 3, 8), (3, 4, 7)]
'''
7.unpacking
- 💦추가설명이나 예시 필요
위에서 zip은 요소를 튜플의 형태만 만들어 놓고 주소를 보관한다고 했습니다. 그래서 원래의 iterable의 형태로 다시 돌려놓는 것이 가능합니다.
givenName = zip(["김","이","박"], ["kim","Lee","Park"])
zipped_list = list(zip(["김","이","박"], ["kim","Lee","Park"]))
print(zipped_list)
unpack_list = list(zip(*zipped_list))
print(unpack_list)
## 출력결과
'''
[('김', 'kim'), ('이', 'Lee'), ('박', 'Park')]
[('김', '이', '박'), ('kim', 'Lee', 'Park')]
'''
8.max | min
1) list에서 최대 최소 구하기
iterable 객체를 인자값으로 설정하면 그 안에서 가장 큰 값 또는 작은 값을 반환합니다. list 이외에도 tuple로도 최대 최소값을 구할 수 있습니다.
a = [1, 2, 3]
print(min(a))
## 출력 결과
'''
1
'''
2) dictionary에서 최대 최소 구하기
dictionary에서는 key를 기준으로 최대 최소를 구합니다.
a = {8 : "b", 10 : "d", 7:"z"}
print(min(a))
## 출력 결과
'''
7
'''
3) 같은 타입끼리만 비교 가능
다른 타입을 비교하면 TypeError가 발생하여 같은 타입끼리만 비교 가능합니다.
c = [1, 'a', 'y', 'z']
print(max(c))
## 출력 결과
'''
TypeError: '>' not supported between instances of 'str' and 'int'
'''
4) min(iterable, key)
두번째 인자값에 key를 전달할 수 있는데 이는 iterable의 객체를 비교하는 기준이 됩니다. 함수 또는 lambda 표현식으로 전달할 수 있습니다.
key 인자값을 설정하지 않았을 때는 dictionary의 key로만 비교해서 7 이 나왔었는데 key인자에 dictionary의 key에 대한 value를 반환하도록 lambda를 설정하고 나니 value가 가장 작은 값이 출력되었습니다.
a = {8 : "b", 10 : "d", 7:"z"}
key = min(a, key = lambda k: a[k])
print(key)
## 출력 결과
'''
8
'''
key 인자를 이용한 다른 활용으로는 리스트 의 문자 요소를 하나씩 꺼내 문자의 길이를 비교할 수도 있습니다.
city = ['seoul', 'Busan', 'Incheon', 'Sejong']
longest = max(city, key= lambda n: len(n))
print(longest)
## 출력 결과
'''
Incheon
'''
5) min(iterable, iterable)
두 개 이상의 iterable에 대하여
- 숫자의 경우
b = [10, 9]
c = [10, 3, 2, 1]
print(max(b,c))
# 출력
'''
[10, 9]
'''
- 문자열의 경우
문자열의 경우 문자열의 ASCII 값을 비교하여 가장 낮은 값이 최소 값이 됩니다. a
가 가장 낮기 때문에 apple
이 최소 값으로 리턴되었습니다.
b = ['y', 'z']
c = ['a', 'z']
print(max(b,c))
9.sum
1) sum(iterable)
iterable 객체 내 각 요소의 합을 구해주는 함수입니다. 이때 iterable 객체는 숫자 인덱스로 접근이 가능한 list나 튜플이어야 합니다. (dictionary의 key 가 숫자인 경우엔 key 값을 모두 더할 수 있습니다.)
num_list = [1 ,2, 3, 4, 5]
print(sum(num_list))
num_tuple = (1 ,2, 3, 4, 5)
print(sum(num_tuple))
num_dict = {2:"a" ,22:"g", 4:"qp", 10: "2"}
print(sum(num_dict))
## 출력결과
'''
15
15
38
'''
2) sum(iterable, start)
iterable의 합산 결과에 start에 지정한 값을 합하여 반환합니다.
num_list = [1 ,2, 3, 4, 5]
print(sum(num_list, 100))
num_tuple = (1 ,2, 3, 4, 5)
print(sum(num_tuple, 200))
num_dict = {2:"a" ,22:"g", 4:"qp", 10: "2"}
print(sum(num_dict, 300))
## 출력 결과
'''
115
215
338
'''
10.int
1) int(str)
- int함수는 문자열 str을 정수로 반환해줍니다.
- 만약에 인자값을 설정하지 않으면 0을 반환합니다.
2) int(str, base)
- int함수에 두번째 인자를 설정하면, 첫번째 인자는 문자열, bytes, 또는 bytearray 여야 합니다.
- 첫번째 매개변수는 base진법의 숫자이며, 반환값은 첫번째 인자값을 10진수로 변환한 값입니다.
- base는 0 또는 2~36까지 설정이 가능합니다.
int('11',2)
# 출력결과
''' 1*2 + 1*1
3
'''
int('54',5)
# 출력결과
''' 2*5 + 4*1
3
'''
- 첫번째 인자값의 각 자리수는 base보다 크면 에러가 발생합니다.
int('64',5)
# 출력결과
'''
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-80-f31e48cc1440> in <module>()
6 '''
7
----> 8 int('64',5)
ValueError: invalid literal for int() with base 5: '64'
'''
활용문제
추가예정
8.divmod
큰 숫자일 때는 a//b, a%b 보다 유리합니다
eval : 가독성이 떨어지고 input 사용하면 PC의 루트가 공개될 수 있으므로 되도록 쓰지 않는 것이 좋습니다.
Leave a comment