on
[파이썬을 파이썬 답게] "Itertools / Collections 모듈"
[파이썬을 파이썬 답게] "Itertools / Collections 모듈"
곱집합(Cartesian product) 구하기
C 언어 or Java 스타일
iterable1 = 'ABCD' iterable2 = 'xy' iterable3 = '1234' for value1 in iterable1: for value2 in iterable2: for value3 in iterable3: print(value1, value2, value3) # 출력 결과 ''' A x 1 A x 2 A x 3 A x 4 A y 1 A y 2 A y 3 A y 4 B x 1 B x 2 B x 3 B x 4 B y 1 B y 2 B y 3 B y 4 C x 1 C x 2 C x 3 C x 4 C y 1 C y 2 C y 3 C y 4 D x 1 D x 2 D x 3 D x 4 D y 1 D y 2 D y 3 D y 4 '''
파이썬 스타일
import itertools iterable1 = 'ABCD' iterable2 = 'xy' iterable3 = '1234' print(list(itertools.product(iterable1, iterable2, iterable3))) # 출력 결과 ''' [('A', 'x', '1'), ('A', 'x', '2'), ('A', 'x', '3'), ('A', 'x', '4'), ('A', 'y', '1'), ('A', 'y', '2'), ('A', 'y', '3'), ('A', 'y', '4'), ('B', 'x', '1'), ('B', 'x', '2'), ('B', 'x', '3'), ('B', 'x', '4'), ('B', 'y', '1'), ('B', 'y', '2'), ('B', 'y', '3'), ('B', 'y', '4'), ('C', 'x', '1'), ('C', 'x', '2'), ('C', 'x', '3'), ('C', 'x', '4'), ('C', 'y', '1'), ('C', 'y', '2'), ('C', 'y', '3'), ('C', 'y', '4'), ('D', 'x', '1'), ('D', 'x', '2'), ('D', 'x', '3'), ('D', 'x', '4'), ('D', 'y', '1'), ('D', 'y', '2'), ('D', 'y', '3'), ('D', 'y', '4')] '''
2차원 리스트를 1차원 리스트로 만들기
C 언어 or Java 스타일
# 방법 1 my_list = [[1, 2], [3, 4], [5, 6]] result1 = [] for element in my_list: result1 += element # 방법 2 result2 = [] for i in mylist: for j in i: result2.append(j)
파이썬 스타일
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 & operator 이용 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 동작 설명
my_list = [[1, 2], [3, 4], [5, 6]] sum(my_list, []) # [1, 2] + [3, 4] + [5, 6] # [1, 2, 3, 4, 5, 6]
※ 방법 2~3 chain이란?
chain('ABC', 'DEF') --> A B C D E F chain.from_iterable(['ABC', 'DEF']) --> A B C D E F
※ 방법 5~6 reduce 함수란?
# reduce(function, iterable) : 여러 개의 데이터를 누적 집계 from functools import reduce my_list = [[1, 2], [3, 4], [5, 6]] list(reduce(lambda x, y: x+y, my_list)) # [1, 2, 3, 4, 5, 6] # ([1, 2] + [3, 4]) + [5, 6] # [1, 2, 3, 4, 5, 6] # operator.add(a+b) : a와 b 숫자에 대해, a + b를 반환 import operator list(reduce(operator.add, my_list)) # ([1, 2] + [3, 4]) + [5, 6] # [1, 2, 3, 4, 5, 6]
※ 방법 7 numpy 동작 설명
my_list = [[1, 2], [3, 4], [5, 6]] import numpy as np my_list = [[1, 2], [3, 4], [5, 6]] print(np.array(my_list)) # 출력 ''' [[1 2] [3 4] [5 6]] ''' print(np.array(my_list).flatten()) # [1 2 3 4 5 6] print(np.array(my_list).flatten().tolist()) # [1, 2, 3, 4, 5, 6]
※ 주의 : numpy는 각 원소의 길이가 동일한 경우에만 사용 가능하다.
[ [1], [2] ] ( O )
[ [1, 2], [2, 3], [4, 5] ] ( O )
[['A', 'B'], ['X', 'Y'], ['1']] ( X )
순열 구하기
C 언어 or Java 스타일
# A', 'B', 'C'로 만들 수 있는 순열의 수 -> 'ABC', 'ACB', 'BAC', 'BCA', 'CAB', 'CBA' def permute(arr): result = [arr[:]] c = [0] * len(arr) i = 0 while i < len(arr): if c[i] < i: if i % 2 == 0: arr[0], arr[i] = arr[i], arr[0] else: arr[c[i]], arr[i] = arr[i], arr[c[i]] result.append(arr[:]) c[i] += 1 i = 0 else: c[i] = 0 i += 1 return result print(permute(["A", "B", "C"])) # [['A', 'B', 'C'], ['B', 'A', 'C'], ['C', 'A', 'B'], ['A', 'C', 'B'], ['B', 'C', 'A'], ['C', 'B', 'A']]
파이썬 스타일
import itertools pool = ['A', 'B', 'C'] print(list(map(''.join, itertools.permutations(pool)))) # 3개의 원소로 순열 만들기 print(list(map(''.join, itertools.permutations(pool, 2)))) # 2개의 원소로 순열 만들기
문자열 중 최대 빈도 수의 문자 구하기
C 언어 or Java 스타일
# my_str = 'aab' # my_str = 'dfdefdgf' my_str = 'bbaa' result = '' d = {} for i in my_str: try: d[i] += 1 except KeyError: d[i] = 1 mx = max(d.values()) for key, val in d.items(): if val == mx: result += key # print(result) # a # print(result) # df print(result) # ab
파이썬 스타일
import collections # my_str = 'aab' # my_str = 'dfdefdgf' my_str = 'bbaa' d = collections.Counter(sorted(my_str)) result = '' mx = max(d.values()) for key, val in d.items(): if val == mx: result += key # print(result) # a # print(result) # df print(result) # ab
참고자료
https://programmers.co.kr/learn/courses/4008
from http://ikjo.tistory.com/32 by ccl(A) rewrite - 2021-11-05 16:27:39