TIL - 파이썬을 파이썬답게 (1)

MinWoo Park·2021년 2월 24일
0

TIL

목록 보기
15/49
post-thumbnail

Today I Learned

매일 배운 것을 정리하며 기록합니다. 프로그래머스에서 '파이썬을 파이썬답게'강의를 수강하였습니다.


몫과 나머지 - divmod

  • 나눗셈 division(div)와 나머지 연산 modulo(mod)를 합쳐 몫과 나머지를 구하는 함수
  • 가독성이나, 팀의 코드 스타일에 따라서, a//b, a%b와 같이 쓸 때가 더 좋을 수도 있음
  • divmod는 작은 숫자를 다룰 때는 a//b, a%b 보다 느립니다. 대신, 큰 숫자를 다룰 때는 전자가 후자보다 더 빠름
  • 파이썬의 divmod와 unpacking을 이용하면 다음과 같이 코드를 짤 수 있습니다.
a = 7
b = 5
print(*divmod(a, b))
# 1 2

n진법을 10진법으로

  • 진법 변환 문제는 알고리즘 문제나 숙제로 자주 나오는 유형
  • 파이썬의 int(x, base = 10) 함수는 진법 변환을 지원
  • 첫 번째 인자로는 변환하고자 하는 진수를 문자열로, 두 번째 인자로는 현재 진수의 진법을 넣음
num = '01011000'
base = 2
answer = int(num, base)
# 88

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

  • 파이썬에서는 ljust, center, rjust와 같은 string의 메소드를 사용해 코드를 획기적으로 줄일 수 있음
s = '가나다'
n = 7

s.ljust(n) # 좌측 정렬
s.center(n) # 가운데 정렬
s.rjust(n) # 우측 정렬

print(s.ljust(n))
# 가나다

print(s.center(n))
#   가나다

print(s.rjust(n))
#     가나다

알파벳 출력하기 - string 모듈

  • 파이썬은 a부터 z까지 가져오는 이런 데이터를 상수(constants)로 정의해놓았습니다.
  • 더 많은 string 상수를 python documentation 에서 확인 가능
import string 

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

원본을 유지한채, 정렬된 리스트 구하기 - sorted

  • 파이썬의 sort() 함수를 사용하면 리스트의 원소를 정렬할 수 있으나 원본의 멤버 순서를 변경함

  • 파이썬의 sorted는 반복문이나, deepcopy 함수를 사용하지 않아도 새로운 정렬된 리스트를 구할 수 있음

list1 = [3, 2, 1]
list2 = sorted(list1)
print(list2)

# [1, 2, 3]

2차원 리스트 뒤집기(전치 행렬) - ⭐️zip⭐️

  • 파이썬의 zip과 unpacking 을 이용하면 코드 한 줄로 리스트를 뒤집을 수 있음
  • iterable 앞에 붙는 *는 unpacking을 해주는 역할
  • 전치 행렬(transposed matrix) : 행과 열을 교환하여 얻는 행렬을 구하는 방법
mylist = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
new_list = list(map(list, zip(*mylist)))
print(new_list)

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

zip 함수에 대해

  • zip(*iterables)는 각 iterables 의 요소들을 모으는 이터레이터를 만듦
  • 튜플의 이터레이터를 돌려주는데, i 번째 튜플은 각 인자로 전달된 시퀀스나 이터러블의 i 번째 요소를 포함
mylist = [1, 2, 3]
new_list = [40, 50, 60]
for i in zip(mylist, new_list):
    print (i)

(1, 40)
(2, 50)
(3, 60)
  • 사용 예 #1 - 여러 개의 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)
  • 사용 예 #2 - Key 리스트와 Value 리스트로 딕셔너리 생성하기
    파이썬의 zip 함수와 dict 생성자를 이용하면 코드 단 한 줄로, 두 리스트를 합쳐 딕셔너리로 만들 수 있습니다.
animals = ['cat', 'dog', 'lion']
sounds = ['meow', 'woof', 'roar']
answer = dict(zip(animals, sounds)) 

# {'cat': 'meow', 'dog': 'woof', 'lion': 'roar'}

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

if __name__ == '__main__':
    mylist = [83, 48, 13, 4, 71, 11]    
    print(solution(mylist))

# [35, 35, 9, 67, 60]

모든 멤버의 type 변환하기 - map

  • 파이썬의 map을 사용하면 for 문을 사용하지 않고도 멤버의 타입을 일괄 변환할 수 있음
list1 = ['1', '100', '33']
list2 = list(map(int, list1))
print(list2)
# [1, 100, 33] 멤버의 타입: 정수형

list3 = list(map(str, list2))
print(list3) 
# ['1', '100', '33'] 멤버의 타입: 문자열

Reference : [프로그래머스] 프로그래밍 강의 - 파이썬을 파이썬답게

profile
물음표를 느낌표로 바꾸는 순간을 사랑하는 개발자입니다.

0개의 댓글