TIL No.19: 파이썬을 파이썬답게

BLAKE KIM·2020년 7월 13일
0

https://programmers.co.kr/learn/courses/4008
위 링크의 강의를 정리한 내용이다.

몫과 나머지 divmod

a = 7
b = 5
print( divmod(a, b) )
  • 큰 수를 적용시킬 때는 divmod가 더 빠르다. 그러나 작은 수는 그렇지 않다. 가독성과 어떤 수를 다룰 것인가에 따라 방법을 선택하자

진법 변환하기 int

# 5진법 수인 num을 10진법으로 표현하기

num = “3212”
base = 5
answer = int(num, base)

문자열 정렬하기 ljust, center, rjust

s = '가나다라'
n = 7

s.ljust(n) # 좌측 정렬
s.center(n) # 가운데 정렬
s.rjust(n) # 우측 정렬
  • n은 문자열의 길이를 뜻한다. 즉 문자가 차지하는 나머지 영역을 채울 공백의 수를 맞춰준다.

알파벳 출력하기 string 모듈

import string 

string.ascii_lowercase # 소문자 abcdefghijklmnopqrstuvwxyz
string.ascii_uppercase # 대문자 ABCDEFGHIJKLMNOPQRSTUVWXYZ
string.ascii_letters #대소문자 모두 abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
string.digits # 숫자 0123456789

2차원 리스트 뒤집기 zip

mylist = [ [1,2,3], [4,5,6], [7,8,9] ]
new_list = list(map(list, zip(mylist)))
  • 같은 인덱스를 가진 요소들끼리 묶어준다.

모든 멤버의 type 변환하기 map

list1 = ['1', '100', '33']
list2 = list(map(int, list1))
  • for문을 사용하지 않고도 하나씩 꺼내서 동일 작업을 반복할 수 있다.

sequence 멤버를 하나로 이어붙이기 join

my_list = ['1', '100', '33']
answer = ''.join(my_list)

삼각형 별찍기 - sequence type의 *연산

  • *연산자를 sequence type에도 이용할 수 있다.

곱집합(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)
  • itertools.product를 이용하면 첫 번째 코드를 두 번째 코드로 줄여 쓸 수 있다.

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

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

import itertools

pool = ['A', 'B', 'C']
print(list(map(''.join, itertools.permutations(pool)))) # 3개의 원소로 수열 만들기
print(list(map(''.join, itertools.permutations(pool, 2)))) # 2개의 원소로 수열 만들기

가장 많이 등장하는 알파벳 찾기 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 문

mylist = [3, 2, 6, 7]
answer = [ i**2 for i in mylist if i %2 == 0]

flag OR for-else

import math

numbers = [int(input()) for _ in range(5)]
multiplied = 1
flag = True
for number in numbers:
    multiplied *= number
    if math.sqrt(multiplied) == int(math.sqrt(multiplied)):
        flag = False
        print('found')
        break

if flag:
    print('not found')
  • math.sqrt(x)는 x의 제곱근을 반환한다. 정수형이 아닌 실수형으로 반환한다.
import math

numbers = [int(input()) for _ in range(5)]
multiplied = 1
for number in numbers:
    multiplied *= number
    if math.sqrt(multiplied) == int(math.sqrt(multiplied)):
        print('found')
        break
else:
    print('not found')
  • for-else문으로 사용할 수도 있다.

두 변수의 값 바꾸기 - swap

a = 3
b = 'abc'

a, b = b, a
  • 이진 탐색: 오름차순으로 정렬된 리스트에서 특정한 값의 위치를 찾는 알고리즘. 검색 속도가 아주 빠르다.
import bisect
mylist = [1, 2, 3, 7, 9, 11, 33]
print(bisect.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)
  • __init__ : 인스턴스를 만들 때 실행되는 함수
  • __str__ : 인스턴스 자체를 출력 할 때의 형식을 지정해주는 함수

가장 큰 수, inf

min_val = float('inf')
min_val > 10000000000
  • inf는 어떤 숫자와 비교해도 무조건 크다고 판정된다.

파일 입출력 간단하게 하기

f = open('myfile.txt', 'r')
while True:
    line = f.readline()
    if not line: break
    raw = line.split()
    print(raw)
f.close()
with open('myfile.txt') as file:
  for line in file.readlines():
    print(line.strip().split('\t')
  • with - as 구문은 파일 뿐만 아니라 socket이나 http 등에서도 사용 가능하다.
profile
BackEnd

0개의 댓글