5-1. 곱집합 (Cartesian product) 구하기 - product
예) ‘ABCD’, ‘xy’의 곱집합 = Ax Ay Bx By Cx Cy Dx Dy
- itertools.product 사용으로 for 문을 사용하지 않더라도 곱집합 구할 수 있음.
import itertools
iterable1 = 'ABCD'
iterable2 = 'xy'
iterable3 = '1234'
print(list(itertools.product(iterable1, iterable2, iterable3)
5-2. 2차원 리스트를 1차원 리스트로 만들기
- mylist = 문자열을 담은 이차원 리스트 → 일차원 리스트로 리턴
import itertools
def solution(mylist):
answer = list(itertools.chain.from_iterable(mylist))
return answer
- chain.from_iterable 이용해서 모든 구성요소 나열해서 보여주기
5-3. 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))
- 제한적으로 사용 가능한 방법으로 각 원소의 길이가 동일한 경우에는 numpy의 flatten 사용 가능
- [[1, 2], [2, 3], [4, 5]] → 사용 가능
- [['A', 'B'], ['X', 'Y'], ['1']] → 사용 불가능
import numpy as np
np.array(mylist).flatten().tolist()
5-4. 순열과 조합
- mylist의 원소로 이루어진 모든 순열을 사전순으로 리턴하는 함수
import itertools
def solution(mylist):
answer = list(itertools.permutations(mylist))
answer.sort()
return answer
- 사전 순으로 리턴하기 위해서 마지막에 answer.sort()
5-5. 순열과 조합 - combinations, permutations
순열 (permutation)
: n개의 원소 중에서 r개의 원소를 꺼내는 경우의 수
순서가 유효하기 때문에 원소의 중복을 허용함.
[1, 2, 3] ≠ [3, 2, 1]
조합 (combination)
: n개의 원소 중에서 r개의 원소를 꺼내는 경우의 수
순서가 유효하지 않기 때문에 원소의 중복을 허용하지 않음.
[1, 2, 3] = [3, 2, 1]
import itertools
pool = ['A', 'B', 'C']
print(list(map(''.join, itertools.permutations(pool)))) # 3개의 원소로 순열 만들기
print(list(map(''.join, itertools.permutations(pool, 2)))) # 2개의 원소로 순열 만들기
print(list(map(''.join, itertools.combinations(pool)))) # 3개의 원소로 조합 만들기
print(list(map(''.join, itertools.combinations(pool, 2)))) # 2개의 원소로 조합 만들기
5-6. 가장 많이 등장하는 알파벳 찾기
- 문자열 mystr에서 가장 많이 등장하는 알파벳만을 사전 순으로 출력
from collections import Counter
my_str = input().strip()
count_str = Counter(my_str)
max_value = max(list(count_str.values()))
answer = []
for key in list(count_str.keys()):
if count_str[key] == max_value:
answer.append(key)
answer.sort()
final_answer = ''.join(answer)
print(final_answer)
- Counter을 이용해서 각 문자열별 빈도수 찾기
- count.keys() → key value 리턴
- count.values() → value 리턴
5-7. 가장 많이 등장하는 알파벳 찾기 - 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