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

MinWoo Park·2021년 2월 25일
0

TIL

목록 보기
16/49
post-thumbnail

Today I Learned

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


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

  • ex)
    - 문자열 배열 ['1', '100', '33']을 이어 붙여 문자열 '110033' 만들기
    - 정수형 튜플 (3, 22, 91)을 이어붙여 문자열 '32291' 만들기
my_list = ['1', '100', '33']
answer = ''.join(my_list)
print(answer)
print(type(answer))

# 110033
# <class 'str'>

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

  • 파이썬에서는 *연산자를 사용해 코드를 획기적으로 줄일 수 있음
n = 5
answer = 'abc'*n
print(answer)
# abcabcabcabcabc

answer= [123, 456]*n
print(answer)
# [123, 456, 123, 456, 123, 456, 123, 456, 123, 456]

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

  • iterable으로 곱집합을 구하는 방법
    ex) 두 스트링 'ABCD', 'xy' 의 곱집합은 Ax Ay Bx By Cx Cy Dx Dy
  • product()함수의 리턴값이 iterator이기 때문에 next()를 적용해 하나하나 꺼내거나, for문을 통해 값을 꺼낼 수 있음
import itertools

iterable1 = 'ABCD'
iterable2 = 'xy'
iterable3 = '1234'
itertools.product(iterable1, iterable2, iterable3)
# <itertools.product object at 0x7f9f25732c40>

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

  • 2차원 리스트를 1차원 리스트로 만드는(평탄화) 다양한 방법
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()
예를 들어 다음과 같은 리스트는 편평하게 만들 수 있고

[[1], [2]]
[[1, 2], [2, 3], [4, 5]]

다음과 같이 같이 각 원소의 길이가 다른 리스트는 편평하게 만들 수 없습니다.

[['A', 'B'], ['X', 'Y'], ['1]] # 방법 7로 평탄화 불가능

순열과 조합 - combinations, permutations

  • iterable의 원소로 순열과 조합을 구하는 방법
    ex)
    1,2,3의 숫자가 적힌 카드가 있을 때, 이 중 두 장을 꺼내는 경우의 수 -> 12, 13, 21, 23, 31, 32
    'A', 'B', 'C'로 만들 수 있는 경우의 수 -> 'ABC', 'ACB', 'BAC', 'BCA', 'CAB', 'CBA'
import itertools

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

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

  • 알고리즘 문제를 풀다 보면 어떤 원소 x가 주어진 시퀀스타입에 몇 번이나 등장하는지 세야 할 때가 있음
  • 파이썬의 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 문을 한 번에 처리할 수 있음
  • list comprehension의 syntax는 Displays for lists, sets and dictionaries 에서 확인하실 수 있습니다. 1
mylist = [3, 2, 6, 7]
answer = [i**2 for i in mylist if i %2 == 0]

flag OR for-else

-파이썬의 for-else 문을 사용하면 코드를 짧게 쓸 수 있고, 그 의미를 알아보기 쉬움

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')

두 변수의 값 바꾸기 - swap

  • 파이썬에서는 다음과 같이 한 줄로 두 값을 바꿔치기할 수 있음
a = 3
b = 'abc'

a, b = b, a 

  • 파이썬의 bisect.bisect 메소드를 사용하면 이 코드를 간략하게 만들 수 있음
  • 이진 탐색이란, 오름차순으로 정렬된 리스트에서 특정한 값의 위치를 찾는 알고리즘
import bisect
mylist = [1, 2, 3, 7, 9, 11, 33]
print(bisect.bisect(mylist, 3))

클래스 인스턴스 출력하기 - class의 자동 string casting

  • 파이썬에서는 str 메소드를 사용해 class 내부에서 출력 format을 지정할 수 있습니다.
  • ex) 2차원 평면 위의 점을 나타내는 Coord 클래스의 인스턴스를 (x 값, y 값)으로 출력하기
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)

가장 큰 수, inf

  • 코딩 테스트 문제 등을 풀다 보면, 최솟값을 저장하는 변수에 아주 큰 값을 할당해야 할 때가 있음
  • inf는 어떤 숫자와 비교해도 무조건 크다고 판정됨
min_val = float('inf')
min_val > 10000000000
# inf에는 음수 기호를 붙이는 것도 가능합니다.

max_val = float('-inf')

파일 입출력 간단하게 하기

  • 파이썬의 with - as 구문을 이용하면 코드를 더 간결하게 짤 수 있음
  • 파일을 close 하지 않아도 됨: with - as 블록이 종료되면 파일이 자동으로 close 됨
  • readlines가 EOF까지만 읽으므로, while 문 안에서 EOF를 체크할 필요가 없음
with open('myfile.txt') as file:
    for line in file.readlines():
        print(line.strip().split('\t'))

⨳ with - as 구문은 파일 뿐만 아니라 socket이나 http 등에서도 사용할 수 있습니다.


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

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

0개의 댓글