COS Pro 빈출 내장함수를 빠르게 정리하고, 문제 6개로 확인. 짧은 세션으로 진행.
nums = [3, 1, 4, 1, 5]
sorted(nums) # [1, 1, 3, 4, 5]
sorted(nums, reverse=True) # [5, 4, 3, 1, 1]
# key 파라미터 — COS Pro 단골!
words = ["banana", "apple", "cherry"]
sorted(words, key=len) # ['apple', 'banana', 'cherry']
students = [("철수", 85), ("영희", 92), ("민수", 78)]
sorted(students, key=lambda x: x[1]) # 점수 기준 정렬
sort()는 원본 변경, sorted()는 새 리스트 반환. 이전 세션에서 배운 내용의 복습이다.
fruits = ["사과", "바나나", "포도"]
for i, fruit in enumerate(fruits):
print(i, fruit)
# 0 사과 / 1 바나나 / 2 포도
# start 파라미터로 시작 번호 지정
for i, fruit in enumerate(fruits, start=1):
print(i, fruit) # 1부터 시작
Java의 for(int i=0; i<arr.length; i++) 대신 Python은 enumerate()를 쓴다. 인덱스와 값이 동시에 필요할 때 필수.
names = ["철수", "영희", "민수"]
scores = [85, 92, 78]
for name, score in zip(names, scores):
print(f"{name}: {score}점")
# 딕셔너리 만들기
score_dict = dict(zip(names, scores))
# {'철수': 85, '영희': 92, '민수': 78}
길이가 다르면 짧은 쪽에 맞춰서 잘린다. dict(zip(키리스트, 값리스트))는 딕셔너리 생성의 정석 패턴이다.
nums = ["1", "2", "3"]
list(map(int, nums)) # [1, 2, 3]
nums = [1, 2, 3, 4]
list(map(lambda x: x ** 2, nums)) # [1, 4, 9, 16]
input().split()으로 받은 문자열을 숫자로 바꿀 때 list(map(int, input().split()))은 거의 공식이다.
nums = [1, 2, 3, 4, 5, 6]
list(filter(lambda x: x % 2 == 0, nums)) # [2, 4, 6]
리스트 컴프리헨션 [x for x in nums if x % 2 == 0]과 같은 결과. COS Pro에서는 둘 다 나오므로 두 방식 다 알아야 한다.
→ filter()는 리스트가 아니라 filter 객체(이터레이터)를 반환한다. map()도 마찬가지.
result = filter(lambda x: x % 2 == 0, nums)
print(type(result)) # <class 'filter'>
그래서 인덱스 접근(result[0])이나 len()을 쓰려면 list()로 감싸야 한다. 하지만 sorted(), for문, sum() 등에는 이터레이터를 바로 넣을 수 있다:
# list()로 감싸야 할 때: 인덱스 접근, len(), 출력 확인
lst = list(filter(lambda x: x > 3, nums))
print(lst[0]) # OK
print(len(lst)) # OK
# 안 감싸도 될 때: sorted(), for문, sum() 등
sorted(filter(lambda x: x > 3, nums)) # OK
for x in filter(lambda x: x > 3, nums): # OK
Java로 비유하면 Stream과 비슷하다 — .collect(Collectors.toList()) 해야 리스트가 되는 것처럼, Python도 list()로 감싸야 리스트가 된다.
scores = [85, 92, 78, 60]
all(s >= 60 for s in scores) # True — 전원 60점 이상?
any(s >= 90 for s in scores) # True — 90점 이상이 한 명이라도?
any(): 하나라도 True면 Trueall(): 전부 True여야 TrueJava의 .stream().anyMatch() / .allMatch()와 같은 개념이다.
sum([1, 2, 3, 4, 5]) # 15
avg = sum(scores) / len(scores) # 평균 구하기
→ statistics 모듈에 mean()이 있지만, import가 필요한 모듈 함수다. COS Pro에서는 보통 sum(scores) / len(scores)로 직접 구한다. sum()이 내장함수이므로 import 없이 바로 쓸 수 있다.
abs(-5) # 5 — 절대값
divmod(17, 5) # (3, 2) — 몫과 나머지 동시에
pow(2, 10) # 1024 — 거듭제곱
| Python 함수 | 하는 일 | Java 대응 |
|---|---|---|
sorted(lst, key=) | 정렬 (새 리스트) | Collections.sort() |
enumerate(lst) | 인덱스+값 순회 | for(int i=0;...) |
zip(a, b) | 병렬 순회 | 직접 인덱스로 접근 |
map(func, lst) | 전체 변환 | .stream().map() |
filter(func, lst) | 조건 필터 | .stream().filter() |
any() / all() | 조건 검사 | .stream().anyMatch() |
sum() | 합계 | .stream().sum() |
def above_average(scores):
avg_score = sum(scores) / len(scores)
tmp_list = [x for x in scores if x >= avg_score] # 리스트 컴프리헨션
tmp_list2 = filter(lambda x: x >= avg_score, scores) # filter 버전
return sorted(tmp_list2, reverse=True)
filter와 리스트 컴프리헨션 두 가지를 스스로 비교하며 작성했다. 둘 다 같은 결과이므로 본인이 편한 방식을 쓰면 된다.
def make_ranking(names, scores):
pairs = sorted(list(zip(names, scores)), key=lambda x: x[1], reverse=True)
result = []
for idx, pair in enumerate(pairs):
result.append(f"{idx+1}등: {pair[0]} ({pair[1]}점)")
return result
오늘 배운 내장함수 3개를 자연스럽게 조합한 문제. enumerate에서 중첩 언패킹을 쓰면 더 깔끔하게 쓸 수도 있다:
for idx, (name, score) in enumerate(pairs, start=1):
result.append(f"{idx}등: {name} ({score}점)")
start=1을 쓰면 idx+1 없이도 1부터 시작한다.