🗒 강의노트 🗒
곱집합 (Cartesian product) 구하기
보통 곱집합을 구할 때 반복문을 이용해 두 iterable의 원소를 하나씩 곱해간다. 파이썬에서는 itertools.product를 이용하면, for문을 사용하지 않고도 곱집합을 구할 수 있다.
import itertools
iterable1 ='ABCD'
iterable2 = 'xy'
print(list(itertools.product(iterable1, iterable2)))
☐ 문제 1 2차원 리스트를 1차원 리스트로 만들기
문자열을 담은 이차원 리스트, mylist 가 solution 함수의 파라미터로 주어집니다. solution 함수가 mylist를 일차원 리스트로 만들어 리턴하도록 코드를 작성해주세요.
제한 조건
- arr의 길이는 1 이상 100 이하인 자연수입니다.
- arr 원소의 길이는 5를 넘지 않습니다.
입출력 예
☑ Solution
def solution(mylist):
answer = []
for i in mylist:
for j in i:
answer.append(j)
return answer
이 방법 말고도 2차원에서 1차원으로 만드려면 1차원 리스트에 더해주면 되는 것도 있다.
✔ Feedback ✔
보통은 반복문을 이용해 2차원을 1차원으로 만든다. 파이썬에서는 for문을 이용하지 않고 리스트를 이어 붙일 수 있다.
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()
☐ 문제 2 순열과 조합
숫자를 담은 일차원 리스트, mylist에 대해 mylist의 원소로 이루어진 모든 순열을 사전순으로 리턴하는 함수 solution을 완성해주세요.
제한 조건
- mylist 의 길이는 1 이상 100 이하인 자연수입니다.
입출력 예시
☑ Solution
from itertools import *
def solution(mylist):
return sorted(list(permutations(mylist, len(mylist))))
- permutaions : 순열을 만드는 라이브러리이다. 순서를 고려하여 중복없이 뽑을 수 있다.
- combinations : 조합을 만드는 라이브러이다. 순서를 고려하지 않고 중복없이 뽑을 수 있다.
순서를 고려한다는 것은 AB와 BA는 다른 거라고 취급하는 것이다. 그렇다면 순서를 고려하는 것은 AB와 BA는 같은 거라고 취급한다는 것이다.
☐ 문제 3 가장 많이 등장하는 알파벳 찾기
이 문제에는 표준 입력으로 문자열, mystr이 주어집니다. mystr에서 가장 많이 등장하는 알파벳만을 사전 순으로 출력하는 코드를 작성해주세요.
제한 조건
- mystr의 원소는 알파벳 소문자로만 주어집니다.
- mystr의 길이는 1 이상 100 이하입니다.
입출력 예시
☑ Solution
from collections import Counter
my_str = list(map(str, input().strip()))
count = Counter(my_str)
max = 0
ans = []
for key, value in count.items():
if max <= value:
max = value
ans.append(key)
print(''.join(sorted(ans)))
예제는 통과했으나 다른 테스트 케이스에서 통과하지 못했다. Counter을 사용했는데 왜일까?
ccddd를 입력했을 때 올바른 출력값은 d이다. 그러나 위의 코드는 cd를 출력한다.
max가 처음엔 0이었으니 c의 개수가 최댓값이 되어서 c도 출력되는 것이다. 이 반례를 가지고 다시 풀어서 해결했다.
from collections import Counter
my_str = sorted(list(map(str, input().strip()))) #문자를 분리하고 사전순으로 정렬
m = max(Counter(my_str).values()) #최댓값
for key, value in Counter(my_str).items():
if m <= value:
print(key, end = '')
- Counter.keys() : 키 값을 반환한다. { 'c' : 2, 'd' : 3 } 에서 c와 d를 반환한다.
- Counter.values() : values값을 반환한다. { 'c' : 2, 'd' : 3 } 에서 2와 3을 반환한다.
- Counter.items() : key와 value 값을 반환한다.
'파이썬 강의 > 파이썬을 파이썬답게' 카테고리의 다른 글
[파이썬을 파이썬답게] Part 05. Sequence Types 다루기 (Programmers) (1) | 2023.10.17 |
---|---|
[파이썬을 파이썬답게] Part 04. Iterable 다루기 (Programmers) (1) | 2023.10.17 |
[파이썬을 파이썬답게] Part 03. Str 다루기 (Programmers) (1) | 2023.10.16 |
[파이썬을 파이썬답게] Part 02. 정수 다루기 (Programmers) (1) | 2023.10.16 |
[파이썬을 파이썬답게] Part 01. Python 꿀팁 (Programmers) (0) | 2023.10.16 |