https://programmers.co.kr/learn/courses/4008
복습할 겸 해서 위의 강의를 수강하면서 실습!
부가적으로 공부한 부분도 있다.
divmod¶
몫과 나머지 구하기
a, b = 29, 3
a, b = divmod(a, b)
print(a, b)
a, b = 29, 3
a, b = a//b, a%b
print(a, b)
같은 결과값을 출력한다.
작은 숫자를 다룰 때는 아래와 같은 방식이 더 빠르고, 큰 수를 다룰 때는 위와 같은 방식이 더 빠르다.
int(num, base)¶
진법 변환
num, base = '3212', 5
answer = 0
for idx, x in enumerate(num[::-1]):
answer = answer + int(x)*(base**idx)
answer
num = '3212'
base = 5
answer = int(num, base) # base의 default값은 10
answer
같은 결과값을 출력한다.
ljust, center, rjust¶
문자열 왼쪽 정렬, 가운데 정렬, 오른쪽 정렬
s, n = 'abc', 7
n = int(n)
a = s+' '*(n-len(s))
c = ' '*(n-len(s))+s
b = ' '*((n-len(s))//2) + s + ' '*((n-len(s))//2)
print(a)
print(b)
print(c)
print(s.ljust(n))
print(s.center(n))
print(s.rjust(n))
같은 결과를 출력한다.
string의 상수¶
# 입력에 따라 모든 영문 대문자 혹은 소문자 출력
num = int(input().strip())
zero = ('').join([chr(i) for i in range(97, 123)])
one = ('').join([chr(i) for i in range(65, 91)])
if num == 0:
print(zero)
if num == 1:
print(one)
import string
string.ascii_lowercase # 소문자 abcdefghijklmnopqrstuvwxyz
string.ascii_uppercase # 대문자 ABCDEFGHIJKLMNOPQRSTUVWXYZ
string.ascii_letters #대소문자 모두 abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
string.digits # 숫자 0123456789
파이썬에서는 이러한 것들을 상수로 정의해두었다.
원본을 유지한채, 정렬된 리스트 구하기 - sorted¶
a = [3,2,1]
b = sorted(a, reverse = False)
b
list의 메서드로 sort()도 있다. 이는 return None으로 inplace 저장되는 메서드이므로 주의.
2차원 리스트 뒤집기¶
def solution(mylist):
answer = []
answer = [[] for _ in mylist]
for idx in mylist:
for jdx, item in enumerate(idx):
answer[jdx].append(item)
return answer
mylist = [ [1,2,3], [4,5,6], [7,8,9] ]
new_list = list(map(list, zip(*mylist)))
new_list
zip과 unpacking을 이용하여 리스트를 뒤집을 수 있다.
zip(*iterables)는 각 iterables 의 요소들을 모으는 이터레이터를 만듭니다.
튜플의 이터레이터를 돌려주는데, i 번째 튜플은 각 인자로 전달된 시퀀스나 이터러블의 i 번째 요소를 포함합니다.
mylist = [ 1,2,3 ]
new_list = [ 40, 50, 60 ]
for i in zip(mylist, new_list):
print (i)
여러 개의 Iterable 동시에 순회할 때 사용
list1 = [1, 2, 3, 4]
list2 = [100, 120, 30, 300]
list3 = [392, 2, 33, 1]
answer = []
for i, j, k in zip(list1, list2, list3):
print( i + j + k )
Key 리스트와 Value 리스트로 딕셔너리 생성
animals = ['cat', 'dog', 'lion']
sounds = ['meow', 'woof', 'roar']
answer = dict(zip(animals, sounds))
answer
모든 멤버의 type 변환하기 - map¶
answer = ['1', '2', '3']
answer = [ int(_) for _ in mylist]
answer
list1 = ['1', '2', '3']
list2 = list(map(int, list1))
list2
같은 결과값
sequence 멤버를 하나로 이어붙이기 - join¶
my_list = ['1', '100', '33']
answer = ''.join(my_list)
answer = ('').join(my_list)
괄호를 붙여도 되고 안 붙여도 된다.
삼각형 별찍기¶
n = int(input().strip())
for i in range(1, n+1):
print('*'*i)
곱집합(Cartesian product) 구하기 - product¶
iterable1 = 'ABCD'
iterable2 = 'xy'
iterable3 = '1234'
for i in iterable1:
for j in iterable2:
for k in iterable3:
print(i+j+k)
import itertools
iterable1 = 'ABCD'
iterable2 = 'xy'
iterable3 = '1234'
itertools.product(iterable1, iterable2, iterable3)
for i in itertools.product(iterable1, iterable2, iterable3):
print(i)
itertools.product(iterable1, iterable2, iterable3)
그냥 프린트하려고 하면 이렇게 iterable 객체를 출력하고, for문 또는 list comprehension으로 출력하면 값을 확인 가능하다.
2차원 리스트를 1차원 리스트로 만들기¶
def solution(mylist):
answer = list()
for idx in mylist:
answer.extend(idx)
return answer
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))
reduce(함수, 순서형 자료)
순서형 자료(문자열, 리스트, 튜플)의 원소들을 누적적으로 함수에 적용시킨다.
순열과 조합¶
import itertools
def solution(mylist):
answer = [list(idx) for idx in itertools.permutations(mylist)]
answer.sort()
return answer
가장 많이 등장하는 알파벳 찾기¶
my_str = input().strip()
maxdict = dict()
maxstr = 0
for idx in my_str:
if idx not in maxdict.keys():
maxdict[idx] = 1
if maxdict[idx] > maxstr:
maxstr = maxdict[idx]
else:
maxdict[idx] += 1
if maxdict[idx] > maxstr:
maxstr = maxdict[idx]
answer = [ k for k, v in maxdict.items() if v == maxstr]
answer.sort()
answer = ''.join(answer)
print(answer)
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)
collections의 counter를 이용해 간단하게 등장 갯수를 셀 수 있다.
요소의 개수가 많은 것부터 출력
import collections
c = collections.Counter(a=2, b=3, c=2)
print(collections.Counter(c))
print(sorted(c.elements()))
값 = 개수를 입력값으로 줄 수도 있다.
c.update('abc&##39;)
c
update()는 Counter의 값을 갱신하는 것을 의미한다.
c.items()
dictionary의 items() 메서드와 같다.
c.elements()
list(c.elements())
입력된 값의 요소에 해당하는 값을 풀어서 반환한다. 요소는 무작위로 반환하며, 요소 수가 1보다 작을 경우 elements는 이를 출력하지 않는다.
sorted(c.elements())
iterable이므로 sorted() 사용 가능
c.most_common(1)
등장 빈도수가 높은 순으로 상위 n개를 list(tuple) 형태로 변환하여 출력한다.
c.most_common()
n을 입력하지 않은 경우 전체에 대한 등장 빈도수를 내림차순으로 출력한다.
c.subtract('abc')
c
말 그대로 요소를 빼는것을 의미한다. 다만, 요소가 없는 경우는 음수의 값이 출력된다.
c.subtract('z')
c
Counter는 산술 연산이 가능하다.
a = collections.Counter(['a', 'b', 'c', 'b', 'd', 'a'])
b = collections.Counter('aaeroplane')
print(a)
print(b)
print(a+b)
import collections
a = collections.Counter('aabbccdd')
b = collections.Counter('abbbce')
print(a-b)
Counter의 뺄셈은 음수값은 출력하지 않는다.
import collections
a = collections.Counter('aabbccdd')
b = collections.Counter('aabbbce')
print(a & b)
교집합(&) : 딕셔너리 형태로 반환된다.
print(a | b)
합집합(|) : 딕셔너리 형태로 반환된다.
list comprehension¶
def solution(mylist):
answer = [i**2 for i in mylist if i%2 == 0]
return answer
swap¶
a = 1
b = 2
a, b = b, a
print(a, b)
bisect¶
python의 이진 탐색 모듈
import bisect
mylist = [1, 2, 3, 7, 9, 11, 33]
print(bisect.bisect(mylist, 3))
def bisect(a, x, lo=0, hi=None):
if lo < 0:
raise ValueError('lo must be non-negative')
if hi is None:
hi = len(a)
while lo < hi:
mid = (lo + hi) // 2
if a[mid] < x:
lo = mid + 1
else:
hi = mid
return lo
mylist = [1, 2, 3, 7, 9, 11, 33]
print(bisect(mylist, 3))
클래스 인스턴스 출력하기 - class의 자동 string casting¶
class Coord(object):
def __init__ (self, x, y):
self.x, self.y = x, y
def __str__ (self):
return '({}, {})'.format(self.x, self.y)
point = Coord(1, 2)
print(point)
가장 큰 수, inf¶
min_val = float('inf')
max_val = float('-inf')
비교 문제에서 초기화할 때 요긴하다.
파일 입출력 간단하게 하기¶
with open('file.txt') as f:
do something
- 파일을 close 하지 않아도 됩니다: with - as 블록이 종료되면 파일이 자동으로 close 됩니다.
- readlines가 EOF까지만 읽으므로, while 문 안에서 EOF를 체크할 필요가 없습니다.
# with open('myfile.txt') as file:
# for line in file.readlines():
# print(line.strip().split('\t'))
socket이나 http 등에서도 사용 가능하다.
'language' 카테고리의 다른 글
데이터의 입력과 출력 (0) | 2019.09.24 |
---|---|
파이썬과 private attribute (0) | 2019.09.21 |
파이썬의 class와 self (0) | 2019.09.21 |
파이썬 언어의 특징, 연산자 오버로딩, 할당, 자료형1 (0) | 2019.09.11 |
정렬 - list.sort(), sorted() (0) | 2019.09.06 |