[python] 자주사용되는 Built-In Functions과 활용예시 - ✨추가중

September 17 2021

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의 루트가 공개될 수 있으므로 되도록 쓰지 않는 것이 좋습니다.

Categories:

Updated:

Leave a comment