[PYTHON] 파이썬을 파이썬 답게 #5 Itertools / Collections 모듈

✨New Wisdom✨·2020년 8월 30일
0

📘 Python 📘

목록 보기
7/11
post-thumbnail

프로그래머스 : https://programmers.co.kr/learn/courses/4008

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

곱집합을 구하려면 다중 for문을 구현해야하지만...
파이썬에서는 itertools.product를 이용하면,
for 문을 사용하지 않고도 곱집합을 구할 수 있다!

📘 문서

import itertools

str1 = 'ABCD'
str2 = 'xy'
str3 = '1234'
itertools.product(str1, str2, str3)

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

나는 처음에 for 문을 사용했다.

def solution(mylist):
    answer = []
    for i in mylist:
        for j in i:
            answer.append(j)
    return answer

하지만 파이썬의 다양한 기능으로 코드를 더 간결하게 만들 수 있다.

my_list = [[1, 2], [3, 4], [5, 6]]

# 방법 1 - sum 함수
answer = sum(my_list, [])

# 방법 2 - itertools.chain.from_iterable
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()

sum

sum()은 1차원 배열에서 모든 원소의 합을 구해주는데,
신기하게도 sum(2차원_배열, []) 으로 사용하면
2차원 배열의 모든 원소들의 합을 구한다.

itertools.chain

파이썬 라이브러리인 itertools에는
iterable한 컨테이너랑 쓸 수 있는 여러 메소드들이 있다.
itertools.chain()이라는 함수는 인자로 받은 iterator들의 원소를 연결해 반환하는 메소드다.
하지만 이 메소드는 1차원 배열에서만 모든 요소를 연결해 반환해주고,
2차원 배열 일 때는 따로 또 작업이 필요하다.

  • itertools.chain.from_iterable() : 하나의 iterator만 전달해도 모든 요소들을 조회하면서 넘겨준다.

  • itertools.chain(*my_list) : 2차원 리스트를 한 번 unpacking해서 넘겨준다.

list comprehension

표현식에 이중 for 문을 사용하여 1차원으로 만든다.

reduce

파이썬3 부터 내장함수에서 빠져 import 해주어야한다.
reduce(function, iterable[, initializer]) 형식으로 사용하며
function과 iterable은 반드시 매개변수로 넘겨주어야 한다.
초기값을 기준으로 데이터를 루프 돌면서 집계 함수를 적용해 데이터를 누적하는 방식으로 작동한다.

numpy 라이브러리의 flatten

numpy의 flatten() 은 다차원 배열을 1차원으로 평평하게 해준다.

🚩 순열과 조합 - combinations, permutations

ex) 1,2,3의 숫자가 적힌 카드가 있을 때, 이 중 두 장을 꺼내는 경우의 수 -> 12, 13, 21, 23, 31, 32

같이 순열과 조합이 필요한 문제에서 파이썬의 itertools의 permutation을 이용하면 쉽게 구할 수 있다.

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 이다.
어떤 수가 몇 번 들어있는지 세준다.

my_str = input().strip()
import collections

max_s =''
max_n = 0
arr = collections.Counter(my_str)

for i in arr.keys():

    if arr[i] >max_n:
        max_s = i
        max_n = arr[i]
    elif arr[i] == max_n:
        max_s +=i
        
    
print(''.join(sorted(max_s)))

➕ 문자열 정렬하기

''.join(sorted(max_s))
profile
🚛 블로그 이사합니다 https://newwisdom.tistory.com/

0개의 댓글