파이썬 Counter, Lambda, Set, Zip

KangMyungJoe·2023년 9월 18일
0

algorithm

목록 보기
47/55
post-thumbnail

해당 내용은 코딩 테스트 합격자 되기의 저자께서 작성한 코드를 기반으로 작성했습니다.
출처

1. Counter

Counter 라이브러리는 Collections에 포함되어 있으며 iterable 객체의 정보를 한눈에 보여주기 위해 사용한다.

  • Counter(iterable): iterable 객체(문자열, 리스트, 튜플 등)를 받아, 각 요소의 빈도수를 계산하여 Counter 객체를 생성한다. 시간 복잡도는 O(n)이며, n=len(lterable)이다.

  • Counter.most_common(num): Counter 객체에서 가장 빈번하게 발생하는 num개의 요소와 그 개수를 리스트로 반환한다. num이 지정되지 않거나 None면 모든 요소를 반환한다. 시간 복잡도는 O(n log n)이며, nCounter 객체의 원소 개수다.

  • Counter.elements(): Counter 객체에서 요소들을 횟수에 따라 반복하는 iterator를 반환한다. 시간 복잡도는 O(n), nelements의 총 개수다.

아래 코드는 예시를 나타낸다.

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']

2. lambda

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

3. Set

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

4. Zip

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 함수는 
# 가장 짧은 이터러블의 길이에 맞춰서 그룹을 생성합니다.
profile
소통을 잘하는 개발자가 되고 싶습니다.

0개의 댓글