
Python collections 모듈에 포함된 데이터 개수 세기용 클래스
Java의HashMap처럼 쓰면 됨
list, tuple, string 등 반복 가능한 객체를 넣으면 각 요소의 개수를 자동으로 카운팅해줌
# 기본 사용법
from collections import Counter
arr = ['a', 'b', 'b', 'c', 'a', 'a']
count = Counter(arr)
print(count) # Counter({'a': 3, 'b': 2, 'c': 1})
print(count['a']) # 3
print(count['b']) # 2
print(count['d']) # 0 (없는 값은 0으로 반환)
# Counter 간 연산
c1 = Counter(['a', 'b', 'b', 'c'])
c2 = Counter(['b', 'c'])
print(c1 - c2) # Counter({'a': 1, 'b': 1})
# 가장 많이 나온 순으로 정렬해서 반환
print(count.most_common(2)) # [('a', 3), ('b', 2)]
# 요소 종류의 개수
print(len(count)) # 3 (a, b, c 세 종류)
# 요소 전체 개수 합
print(sum(count.values())) # 6 (a:3 + b:2 + c:1)
person1 = "철수"
person2 = "영희"
print(person1 + "는 " + person2 + "를 좋아한대요!") # 더하기 연산자
print("%s는 %s를 좋아한대요!"%(person1, person2)) # 포맷 스트링
print("{}는 {}를 좋아한대요!".format(person1, person2)) # format 함수
print(f"{person1}는 {person2}를 좋아한대요!") # f-string
| 더하기 연산자 | 포맷 스트링 | format 함수 | f-string | |
|---|---|---|---|---|
| 실행 속도 | 97.1 µs | 113 µs | 101 µs | 96.4 µs |
map()은 각 요소에 대해 지정된 함수를 적용한 결과를 포함하는 이터레이터(iterator)를 반환합니다. 이 이터레이터는 실제로 평가되기 전까지는 아무 작업도 수행하지 않습니다. 따라서, list(map(...))로 변환해야만 각 요소에 대해 함수를 적용하고, 그 결과를 평가하여 리스트로 반환합니다.
def rental_book(user_info):
print(f"{user_info}님의 책을 대여했습니다.")
many_user = ['김시습', '허균', '남영로', '임제', '박지원']
for user_info in many_user:
rental_book(user_info)
# 위의 for문을 아래 람다식으로 작성하면 출력되지않음
lambda user_info : rental_book(user_info), many_user
# map 함수를 사용한 출력 (list로 변환하여 실행)
list(map(lambda user_info: rental_book(user_info), many_user))
for문 + if문 + list.append() = List comprehension
대부분의 경우 가장 빠르고 pythonic한 방법
# 기존 문법1 - for + append()
numbers = []
for n in range(1, 10+1):
numbers.append(n)
# 기존 문법2 - for문 + if문 + append()
even_numbers = []
for n in range(1, 10+1):
if n % 2 == 0:
even_numbers.append(n)
# 리스트 컴프리헨션1
[x for x in range(10)]
# 리스트 컴프리헨션2
[x for x in range(1, 10+1) if x % 2 == 0]
[2, 4, 6, 8, 10]
# enumerate(iterable, start = 0)
# itearable = 반복 가능한 자료형
# start = 인덱스의 시작 값(!=위치)을 설정
fruits = ['apple', 'banana', 'cherry']
for index, fruit in enumerate(fruits, 3):
print(f"인덱스 {index}: {fruit}")
'''
3 apple
4 banana
5 cherry
'''
SWEA 11633번을 풀다가 발생한 문제
# 잘못된 코드
T = int(input()) # 테스트케이스 개수
for tc in range(1, T+1):
N, M = map(int, input().split())
arr = list(map(int, input().split()))
min_v = float('inf')
max_v = float('-inf')
for i in range(N-M+1):
sum_v = 0
for j in range(M):
sum_v += arr[i+j]
if sum_v < min_v:
min_v = sum_v
elif sum_v > max_v:
max_v = sum_v
print(f'#{tc} {max_v - min_v}')
위와 같이 작성하면 처음 min_v과 max_v을 업데이트할 때 동시에 접근할 수 없다.
# 올바른 코드
T = int(input()) # 테스트케이스 개수
for tc in range(1, T+1):
N, M = map(int, input().split())
arr = list(map(int, input().split()))
min_v = float('inf')
max_v = float('-inf')
for i in range(N-M+1):
sum_v = 0
for j in range(M):
sum_v += arr[i+j]
if sum_v < min_v:
min_v = sum_v
if sum_v > max_v:
max_v = sum_v
print(f'#{tc} {max_v - min_v}')
if - if 구조는 참/거짓 여부에 상관없이 모두 실행되고,
if - elif 구조는 앞의 조건이 참이면 뒤의 조건문은 실행되지않는다.
min_v = float('inf')
max_v = float('-inf')
O(1) 시간 내에 이루어지고 단일 float값이라 시간·공간복잡도에 영향을 주지않는다.
# 잘못된 코드
print(f"#{tc} {*answer}")
f-string에서 unpacking을 직접 사용할 수는 없습니다.
*연산자는 리스트나 튜플의 요소를 언패킹할 때 사용되지만, f-string 내부에서는 이를 지원하지 않습니다.
따라서 언패킹을 f-string 외부에서 처리하고, 이를 f-string 내부에 전달해야 합니다.
# 수정된 코드
print(f"#{tc} {' '.join(map(str, answer))}")
# round half even
print(round(0.5)) # 0
print(round(1.5)) # 2
print(round(2.5)) # 2
print(round(3.5)) # 4
print("f%d", 0.5) # 0
print(round(1.5)) # 2
print(round(2.5)) # 2
print(round(3.5)) # 4