파이썬 응용법 - swkim0128/PARA GitHub Wiki
몫과 나머지 - divmod
정수를 나눈 몫과 나머지를 구해야 할 때,
파이썬에서는 파이썬의 divmod와 unpacking을 이용하면 다음과 같이 코드를 짤 수 있습니다.
a = 7
b = 5
print(*divmod(a, b))
n진법으로 표기된 string을 10진법 숫자로 변환하기 - int 함수
보통 for 문을 이용한 방법.
num = '3212'
base = 5
answer = 0
for idx, number in enumerate(num[::-1]):
answer += int(number) * (base ** idx)
파이썬에서는 파이썬의 int(x, base=10) 함수는 진법 변환을 지원
num = '3212'
base = 5
answer = int(num, base)
문자열 정렬하기 - ljust, center, rjust
보통 for 문을 이용해 기존 스트링에 공백문자 (' ') 를 여러 번 붙이는
### 우측 정렬 예
s = '가나다라'
n = 7
answer = ''
for i in range(n-len(s)): # 문자열의 앞을 빈 문자열로 채우는 for 문
answer += ' '
answer += s
파이썬에서는 ljust, center, rjust와 같은 string의 메소드를 사용
s = '가나다라'
n = 7
s.ljust(n) # 좌측 정렬
s.center(n) # 가운데 정렬
s.rjust(n) # 우측 정렬
알파벳 출력하기 - string 모듈
파이썬은 이런 데이터를 상수(constants)로 정의
import string
string.ascii_lowercase # 소문자 abcdefghijklmnopqrstuvwxyz
string.ascii_uppercase # 대문자 ABCDEFGHIJKLMNOPQRSTUVWXYZ
string.ascii_letters # 대소문자 모두 abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
string.digits # 숫자 0123456789
원본을 유지한채, 정렬된 리스트 구하기 - sorted
파이썬의 sorted를 사용
list1 = [3, 2, 1]
list2 = sorted(list1)
2차원 리스트 뒤집기 - ⭐️zip⭐️
파이썬의 zip과 unpacking 을 이용하면 코드 한 줄로 리스트를 뒤집을 수 있습니다.
mylist = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
new_list = list(map(list, zip(*mylist)))
파이썬 3 한글 번역 - zip에 따르면
zip(*iterables)는 각 iterables 의 요소들을 모으는 이터레이터를 만듭니다.
튜플의 이터레이터를 돌려주는데, i 번째 튜플은 각 인자로 전달된 시퀀스나 이터러블의 i 번째 요소를 포함합니다.
# 사용 예 \#1 - 여러 개의 Iterable 동시에 순회할 때 사용
list1 = [1, 2, 3, 4]
list2 = [100, 120, 30, 300]
list3 = [392, 2, 33, 1]
answer = []
for number1, number2, number3 in zip(list1, list2, list3):
print(number1 + number2 + number3)
# 사용 예 \#2 - Key 리스트와 Value 리스트로 딕셔너리 생성하기
animals = ['cat', 'dog', 'lion']
sounds = ['meow', 'woof', 'roar']
# {'cat': 'meow', 'dog': 'woof', 'lion': 'roar'}
answer = dict(zip(animals, sounds))
i번째 원소와 i+1번째 원소 - zip
파이썬의 zip을 이용하면 index를 사용하지 않고 각 원소에 접근할 수 있습니다.
def solution(mylist):
answer = []
for number1, number2 in zip(mylist, mylist[1:]):
answer.append(abs(number1 - number2))
return answer
모든 멤버의 type 변환하기 - map
파이썬의 map을 사용하면 for 문을 사용하지 않고도 멤버의 타입을 일괄 변환
list1 = ['1', '100', '33']
list2 = list(map(int, list1))
sequence 멤버를 하나로 이어붙이기 - join
파이썬의 str.join(iterable)을 사용하면 이 코드를 두 줄로 줄일 수 있습니다 .
my_list = ['1', '100', '33']
answer = ''.join(my_list)
삼각형 별찍기 - sequence type의 * 연산
파이썬에서는 *연산자를 사용해 코드를 획기적으로 줄일 수 있습니다.
n = 어쩌고
answer = 'abc' * n
n = 어쩌고
answer= [123, 456] * n
곱집합(Cartesian product) 구하기 - product
예시) 두 스트링 'ABCD', 'xy' 의 곱집합은 Ax Ay Bx By Cx Cy Dx Dy 입니다.
보통 for 문을 이용해 두 iterable의 원소를 하나씩 곱해갑니다.
iterable1 = 'ABCD'
iterable2 = 'xy'
iterable3 = '1234'
for value1 in iterable1:
for value2 in iterable2:
for value3 in iterable3:
print(value1, value2, value3)
itertools.product를 이용하면, for 문을 사용하지 않고도 곱집합을 구할 수 있습니다.
import itertools
iterable1 = 'ABCD'
iterable2 = 'xy'
iterable3 = '1234'
print(list(itertools.product(iterable1, iterable2, iterable3)))
2차원 리스트를 1차원 리스트로 만들기 - from_iterable
파이썬의 다양한 기능을 사용하면, for 문을 사용하지 않고도 리스트를 이어 붙일 수 있습니다.
my_list = [[1, 2], [3, 4], [5, 6]]
# 방법 1 - sum 함수
answer = sum(my_list, [])
# 방법 2 - itertools.chain
import itertools
list(itertools.chain.from_iterable(my_list))
# 방법 3 - itertools와 unpacking
import itertools
list(itertools.chain(*my_list))
# 방법 4 - list comprehension 이용
[element for array in my_list for element in array]
# 방법 5 - reduce 함수 이용 1
from functools import reduce
list(reduce(lambda x, y: x+y, my_list))
# 방법 6 - reduce 함수 이용 2
from functools import reduce
import operator
list(reduce(operator.add, my_list))
# 제한적으로 사용 가능한 방법
# 아래의 방법은 각 원소의 길이가 동일한 경우에만 사용 가능합니다.
# 방법 7 - numpy 라이브러리의 flatten 이용
import numpy as np
np.array(my_list).flatten().tolist()
순열과 조합 - combinations, permutations
보통 for 문을 이용해 permutation 함수를 구현
def permute(arr):
result = [arr[:]]
c = [0] * len(arr)
i = 0
while i < len(arr):
if c[i] < i:
if i % 2 == 0:
arr[0], arr[i] = arr[i], arr[0]
else:
arr[c[i]], arr[i] = arr[i], arr[c[i]]
result.append(arr[:])
c[i] += 1
i = 0
else:
c[i] = 0
i += 1
return result
파이썬에서는 itertools.permutation를 이용하면, for문을 사용하지 않고도 순열을 구할 수 있습니다.
import itertools
pool = ['A', 'B', 'C']
print(list(map(''.join, itertools.permutations(pool)))) # 3개의 원소로 수열 만들기
print(list(map(''.join, itertools.permutations(pool, 2)))) # 2개의 원소로 수열 만들기
# 조합은 itertools.combinations를 사용해서 구할 수 있습니다. 사용법은 permutations와 비슷해요!
가장 많이 등장하는 알파벳 찾기 - Counter
보통 반복문을 이용해 수를 셉니다.
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 = {}
for number in my_list:
try:
answer[number] += 1
except KeyError:
answer[number] = 1
print(answer[1]) # = 4
print(answer[3]) # = 3
print(answer[100]) # = raise KeyError
파이썬의 collections.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
for 문과 if문을 한번에 - List comprehension의 if 문
파이썬의 list comprehension을 사용하면 한 줄 안에 for 문과 if 문을 한 번에 처리할 수 있습니다.
mylist = [3, 2, 6, 7]
answer = [number**2 for number in mylist if number % 2 == 0]
flag 대신 for-else 사용하기