[Python] 문법 압축 zip

김민주·2025년 3월 21일

Programming Language

목록 보기
4/12
post-thumbnail

Counter 정리🖋️

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)

print문 실행 속도 비교

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 µs113 µs101 µs96.4 µs

Lambda식 사용시 유의할 점

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))

List comprehension

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

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

if-elif vs. if-if문 차이

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과 max값 초기화하기

min_v = float('inf')
max_v = float('-inf')

O(1) 시간 내에 이루어지고 단일 float값이라 시간·공간복잡도에 영향을 주지않는다.


fstring과 unpacking

# 잘못된 코드
print(f"#{tc} {*answer}")

f-string에서 unpacking을 직접 사용할 수는 없습니다.
*연산자는 리스트나 튜플의 요소를 언패킹할 때 사용되지만, f-string 내부에서는 이를 지원하지 않습니다.
따라서 언패킹을 f-string 외부에서 처리하고, 이를 f-string 내부에 전달해야 합니다.

# 수정된 코드
print(f"#{tc} {' '.join(map(str, answer))}")

소수점 표현법

  1. round() 함수 사용
# round half even
print(round(0.5))	# 0
print(round(1.5))	# 2
print(round(2.5))	# 2
print(round(3.5))	# 4
  1. 출력 지정자 사용
print("f%d", 0.5)	# 0
print(round(1.5))	# 2
print(round(2.5))	# 2
print(round(3.5))	# 4
  1. f-string 사용
    가장 정확한 방법 4. int(float+0.5)
profile
낭비하지마 네 시간은 은행🐰

0개의 댓글