해당 내용은 코딩 테스트 합격자 되기의 저자께서 작성한 코드를 기반으로 작성했습니다.
출처
Counter
라이브러리는 Collections
에 포함되어 있으며 iterable
객체의 정보를 한눈에 보여주기 위해 사용한다.
Counter(iterable)
: iterable
객체(문자열, 리스트, 튜플 등)를 받아, 각 요소의 빈도수를 계산하여 Counter
객체를 생성한다. 시간 복잡도는 O(n)
이며, n=len(lterable)
이다.Counter.most_common(num)
: Counter
객체에서 가장 빈번하게 발생하는 num
개의 요소와 그 개수를 리스트로 반환한다. num
이 지정되지 않거나 None
면 모든 요소를 반환한다. 시간 복잡도는 O(n log n)
이며, n
은 Counter
객체의 원소 개수다.Counter.elements()
: Counter
객체에서 요소들을 횟수에 따라 반복하는 iterator
를 반환한다. 시간 복잡도는 O(n)
, n
은 elements
의 총 개수다.아래 코드는 예시를 나타낸다.
from collections import Counter
# 1. Counter(iterable)
iterable_example = 'abracadabra'
counter_obj = Counter(iterable_example)
print(counter_obj)
# 2. Counter.most_common(num)
most_common_elements = counter_obj.most_common(2)
print(most_common_elements)
# 3. Counter.elements()
elements_iterator = counter_obj.elements()
print(list(elements_iterator))
----------------
1 Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1})
2 [('a', 5), ('b', 2)]
3 ['a', 'a', 'a', 'a', 'a', 'b', 'b', 'r', 'r', 'c', 'd']
lambda
일명 람다는 익명 함수를 생성하는 키워드다. 이는 def
를 사용해 생성하는 함수와 동일하지만, 이름 없이 정의되며 한 줄로 표현할 수 있다.
기본 구조는 다음과 같다.
lambda arguments : expression
이는 다양한 분야에 활용할 수 있으며, 일회성의 간단한 함수나 다른 함수의 인자로 전달될 수 있다.
lambda
함수를 사용해 리스트의 각 요소에 대한 정렬 키를 지정할 수 있다.filter()
에서 활용: lambda
함수를 사용해 iterable
에서 특정 조건을 만족하는 요소만 필터링할 수 있다.map()
에서 활용: lambda
함수를 사용해 iterable
의 모든 요소에 함수를 적용할 수 있다.reduce()
에서 활용: lambda
함수를 사용해 iterable
의 모든 요소를 단일 값으로 줄일 수 있다.다음은 사용 예를 보여주는 코드다.
# 1. 기본적인 lambda 함수:
add = lambda x, y: x + y
print(add(1, 2))
# 2. 리스트의 sort 메서드에서 key 인자로 사용:
my_list = [(1, 2), (3, 1), (5, 0), (4, 5)]
my_list.sort(key=lambda x: x[1])
print(my_list)
# 3. filter 함수에서 사용:
nums = [0, 1, 2, 3, 4, 5]
even_nums = filter(lambda x: x % 2 == 0, nums)
print(list(even_nums))
# 4. map 함수에서 사용:
nums = [0, 1, 2, 3, 4, 5]
squares = map(lambda x: x ** 2, nums)
print(list(squares))
# 5. reduce 함수에서 사용:
from functools import reduce
nums = [1, 2, 3, 4, 5]
sum_of_nums = reduce(lambda x, y: x + y, nums)
print(sum_of_nums)
----------------
1 3
2 [(5, 0), (3, 1), (1, 2), (4, 5)]
3 [0, 2, 4]
4 [0, 1, 4, 9, 16, 25]
5 15
Set
은 파이썬에서 집합을 구현할 때 사용한다.
아래는 집합에서 수행할 수 있는 다양한 연산을 나타낸다.
# 집합 s 생성
s = set()
# s.add(item): 집합 s에 요소 item을 추가합니다.
# 시간 복잡도: O(1)
s.add(1) # 현재 집합: {1}
print(s) -----> {1}
# s.remove(item): 집합 s에서 요소 item을 제거합니다.
# item이 s에 없을 경우 KeyError를 발생시킵니다.
# 시간 복잡도: O(1)
s.remove(1) # 현재 집합: {}
print(s) -----> set()
# s.discard(item): 집합 s에서 요소 item을 제거합니다.
# item이 s에 없어도 에러가 발생하지 않습니다.
# 반환값: 없음
# 시간 복잡도: O(1)
s.discard(1) # 현재 집합: {} (아무 변화 없음)
print(s) -----> set()
# 집합 s와 s2 생성 및 초기화
s = {1, 2, 3}
s2 = {3, 4, 5}
# s.union(s2): 집합 s와 s2의 합집합을 반환합니다.
# 시간 복잡도: O(len(s) + len(s2))
print(s.union(s2)) -----> {1, 2, 3, 4, 5}
# s.intersection(s2): 집합 s와 s2의 교집합을 반환합니다.
# 시간 복잡도: O(min(len(s), len(s2)))
print(s.intersection(s2)) -----> {3}
# s.difference(s2): 집합 s에서 s2의 요소를 제거한 차집합을 반환합니다.
# 시간 복잡도: O(len(s))
print(s.difference(s2)) -----> {1, 2}
# set(list): 리스트를 집합으로 변환합니다.
# 시간 복잡도: O(len(list))
print(set([6, 7, 8])) -----> {8,6,7}, {6,7,8}..
# 집합은 순서를 보장하지 않으므로 순서 달라질수 있음
# item in s: 집합 s에 item이 포함되어 있는지 확인합니다.
# 반환값: bool (True 또는 False)
# 시간 복잡도: O(1)
print(1 in s) -----> True
zip()
함수는 여러 개의 iterable
객체(리스트, 튜플 등)의 요소들을 포장하여 한 번에 하나씩 각 iterable
의 동일한 인덱스에 있는 요소들을 튜플로 그룹화하여 반환한다.
zip()
의 반환 값은 zip
객체이며, 이는 반복자 사용이 가능하다.
아래는 사용 예시를 나타낸다.
# 예시 1: 두 리스트를 zip 함수로 묶기
list1 = [1, 2, 3, 4]
list2 = ['a', 'b', 'c', 'd']
zipped = zip(list1, list2)
print(list(zipped))
# 출력: [(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')]
# 예시 2: 세 리스트를 zip 함수로 묶기
list3 = ['apple', 'banana', 'cherry', 'date']
zipped = zip(list1, list2, list3)
print(list(zipped))
# 출력: [(1, 'a', 'apple'), (2, 'b', 'banana'),
# (3, 'c', 'cherry'), (4, 'd', 'date')]
# 예시 3: zip 함수와 for 루프 함께 사용
# 아래의 코드는 zip 함수를 이용하여 두 리스트의 요소를 동시에 순회하는 예입니다.
for num, letter in zip(list1, list2):
print(f"{num} is paired with '{letter}'")
# 출력: 1 is paired with 'a', 2 is paired with 'b' ....
# 참고: zip 함수는 가장 짧은 길이의 이터러블이 완료되면 중지됩니다.
# 따라서 iterable의 길이가 다르면, zip 함수는
# 가장 짧은 이터러블의 길이에 맞춰서 그룹을 생성합니다.