본문 바로가기

더 나은 엔지니어가 되기 위해/파이썬을 파이썬스럽게

파이썬을 파이썬 답게. (코딩 문제편)

코딩 테스트 문제에서 나 같이 파이썬을 파이썬스럽게 잘 못쓰는 사람들을 위한 강의가 프로그래머스에 있었다.
무료로 진행중인 강의이고, 30분 정도면 금방 볼 수 있는 내용인데, 내가 필요하다 싶은 것만 짧게 정리해두었다.
모든 내용과 출처는 https://programmers.co.kr/learn/courses/4008 여기에 있다.

* 혹시나 문제가 있을 시에, 글을 바로 삭제하겠습니다.

n진법으로 표기된 string을 10진법 숫자로 변환하기 - int 함수

파이썬의 int(x, base = 10) 함수는 진법 변환을 지원합니다. 이 기본적인 함수를 잘 쓰면 코드를 짧게 쓸 수 있고, 또 시간을 절약할 수 있습니다.

num = '3212'
base = 5
answer = int(num, base)

알파벳 출력하기 - string 모듈

파이썬은 이런 데이터를 상수(constants)로 정의해놓았습니다.

import string

string.ascii_lowercase # 소문자
abcdefghijklmnopqrstuvwxyz

string.ascii_uppercase # 대문자
ABCDEFGHIJKLMNOPQRSTUVWXYZ

string.ascii_letters #대소문자 모두 
abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ

string.digits # 숫자 0123456789

2차원 리스트 뒤집기 - zip

파이썬의 zip과 unpacking 을 이용하면 코드 한 줄로 리스트를 뒤집을 수 있습니다.

mylist = [ [1,2,3], [4,5,6], [7,8,9] ]
list(map(list, zip(*mylist)))

# output:
# [[1, 4, 7], # [2, 5, 8], # [3, 6, 9]]

곱집합(Cartesian product) 구하기 - product

itertools.product를 이용하면, for 문을 사용하지 않고도 곱집합을 구할 수 있습니다.

import itertools

iterable1 = 'AB'
iterable2 = 'xy'
iterable3 = '12'

list(itertools.product(iterable1, iterable2, iterable3))

# output:
# [('A', 'x', '1'), ('A', 'x', '2'),
#  ('A', 'y', '1'), ('A', 'y', '2'),
#  ('B', 'x', '1'), ('B', 'x', '2'), 
#  ('B', 'y', '1'), ('B', 'y', '2')]

2차원 리스트를 1차원 리스트로 만들기 - from_iterable

파이썬의 다양한 기능을 사용하면, for 문을 사용하지 않고도 리스트를 이어붙일 수 있습니다.

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

# 방법 1 - sum 함수
answer = sum(my_list, [])

* 가장 참신한 것만 가져왔음.

순열과 조합 - combinations, permutations

itertools.permutation를 이용하면, for문을 사용하지 않고도 순열을 구할 수 있습니다.

import itertools

pool = ['A', 'B', 'C']

# 3개의 원소로 수열 만들기
print(list(map(''.join, itertools.permutations(pool)))) 

# 2개의 원소로 수열 만들기
print(list(map(''.join, itertools.permutations(pool, 2)))) 

# output:
# ['ABC', 'ACB', 'BAC', 'BCA', 'CAB', 'CBA']
# ['AB', 'AC', 'BA', 'BC', 'CA', 'CB']

※ 조합은 itertools.combinations를 사용해서 구할 수 있습니다. 사용법은 permutations와 비슷해요!

가장 많이 등장하는 알파벳 찾기 - Counter

파이썬의 collection.Counter 클래스를 사용하면 이 코드를 간략하게 만들 수 있습니다.

import collections

my_list = [1, 2, 3, 4, 5, 6, 7, 8, 7, 9, 1, 2, 3, 3, 5, 2, 6, 8, 9, 0, 1, 1, 4, 7, 0]
answer = collections.Counter(my_list)

print(answer[1]) # 4
print(answer[3])  # 3
print(answer[100]) # 0

이진 탐색하기 - binary search

파이썬의 bisect.bisect 메소드를 사용하면 이 코드를 간략하게 만들 수 있습니다.

import bisectmylist = [1, 2, 3, 7, 9, 11, 33]
print(bisect.bisect(mylist, 3)) # 3

가장 큰 수, inf

파이썬이 제공하는 inf 를 사용해보세요. inf는 어떤 숫자와 비교해도 무조건 크다고 판정됩니다.

min_val = float('inf')
min_val > 10000000000 # True

inf에는 음수 기호를 붙이는 것도 가능합니다.

max_val = float('-inf')