곱집합을 구하려면 다중 for문을 구현해야하지만...
파이썬에서는 itertools.product를 이용하면,
for 문을 사용하지 않고도 곱집합을 구할 수 있다!
import itertools
str1 = 'ABCD'
str2 = 'xy'
str3 = '1234'
itertools.product(str1, str2, str3)
나는 처음에 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()은 1차원 배열에서 모든 원소의 합을 구해주는데,
신기하게도 sum(2차원_배열, [])
으로 사용하면
2차원 배열의 모든 원소들의 합을 구한다.
파이썬 라이브러리인 itertools에는
iterable한 컨테이너랑 쓸 수 있는 여러 메소드들이 있다.
itertools.chain()
이라는 함수는 인자로 받은 iterator들의 원소를 연결해 반환하는 메소드다.
하지만 이 메소드는 1차원 배열에서만 모든 요소를 연결해 반환해주고,
2차원 배열 일 때는 따로 또 작업이 필요하다.
itertools.chain.from_iterable()
: 하나의 iterator만 전달해도 모든 요소들을 조회하면서 넘겨준다.
itertools.chain(*my_list)
: 2차원 리스트를 한 번 unpacking해서 넘겨준다.
표현식에 이중 for 문을 사용하여 1차원으로 만든다.
파이썬3 부터 내장함수에서 빠져 import 해주어야한다.
reduce(function, iterable[, initializer])
형식으로 사용하며
function과 iterable은 반드시 매개변수로 넘겨주어야 한다.
초기값을 기준으로 데이터를 루프 돌면서 집계 함수를 적용해 데이터를 누적하는 방식으로 작동한다.
numpy의 flatten()
은 다차원 배열을 1차원으로 평평하게 해준다.
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개의 원소로 수열 만들기
알고리즘 문제를 풀다 보면 어떤 원소 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))