파이썬 리스트에서 최솟값과 최댓값 찾기
파이썬 리스트에서 최솟값과 최댓값 찾기
숫자 목록의 가장 작은 값과 큰 값을 찾을 때는 내장 함수 min()과 max()가 가장 직접적입니다. 반복문을 직접 만드는 방법도 살펴보되, 빈 리스트와 같은 실패 조건까지 함께 처리하겠습니다.
min과 max 기본 사용
levels = [12, 7, 21, 15]
print("최저 레벨:", min(levels)) # 7
print("최고 레벨:", max(levels)) # 21두 함수는 리스트뿐 아니라 튜플과 다른 반복 가능한 값에도 사용할 수 있습니다. 문자열과 숫자를 섞으면 서로 비교할 수 없어 TypeError가 발생합니다.
빈 리스트 처리
levels = []
if levels:
lowest = min(levels)
highest = max(levels)
else:
lowest = highest = None
print("레벨 정보가 없습니다.")빈 리스트에 min()이나 max()를 호출하면 ValueError가 발생합니다. 0을 임의의 기본값으로 사용하면 실제 최솟값처럼 오해될 수 있으므로 데이터 의미에 맞는 처리가 필요합니다.
최댓값의 위치 찾기
levels = [12, 21, 7, 21]
highest = max(levels)
first_index = levels.index(highest)
print(highest) # 21
print(first_index) # 1index()는 같은 최고값이 여러 개면 첫 위치만 반환합니다. 모든 위치가 필요하면 enumerate()를 사용합니다.
indexes = [i for i, value in enumerate(levels) if value == highest]
print(indexes) # [1, 3]딕셔너리 목록에서 최고값 찾기
players = [
{"name": "민수", "level": 12},
{"name": "지수", "level": 21},
{"name": "영희", "level": 15},
]
top_player = max(players, key=lambda player: player["level"])
print(top_player) # {'name': '지수', 'level': 21}key는 어떤 값을 기준으로 비교할지 지정합니다. 원본 목록의 순서는 바뀌지 않습니다.
직접 반복문으로 원리 확인
lowest = levels[0]
highest = levels[0]
for level in levels[1:]:
if level < lowest:
lowest = level
if level > highest:
highest = level이 방법도 시작 전에 목록이 비어 있지 않은지 확인해야 합니다. 실제 코드에서는 특별한 이유가 없다면 검증된 내장 함수를 우선 사용하십시오.
동점자를 모두 찾는 실전 예제
players = [
{"name": "민수", "level": 21},
{"name": "지수", "level": 18},
{"name": "영희", "level": 21},
]
top_level = max(p["level"] for p in players)
top_players = [p["name"] for p in players if p["level"] == top_level]
print(top_level, top_players)21 ['민수', '영희']max(..., key=...)는 대표 한 명만 필요할 때, 위 방식은 동점자를 모두 찾아야 할 때 적합합니다.
연습: 최고값과 두 번째로 큰 값
중복을 어떻게 처리할지 먼저 정한 뒤 두 번째로 큰 레벨을 구해 보십시오. 서로 다른 값 기준이라면 sorted(set(levels), reverse=True)를 활용할 수 있습니다. 값이 하나뿐인 목록의 처리도 포함하세요.
값이 아니라 객체를 반환할 때의 주의점
max(players, key=...)가 반환하는 딕셔너리는 원본 목록 안의 객체입니다. 반환된 딕셔너리를 수정하면 원본도 바뀝니다.
top_player = max(players, key=lambda p: p["level"])
top_player["level"] += 1
print(players)조회만 할 때는 문제가 없지만 수정용 결과가 필요하면 복사본을 만들지 판단해야 합니다. 또한 점수가 같을 때는 원본에서 먼저 등장한 항목이 선택됩니다. 동점 규칙을 이름순, 달성 시각순 등으로 정해야 한다면 key에 튜플을 사용하거나 별도 정렬 기준을 작성하십시오.
정리
값만 필요하면 min()과 max(), 비교 기준이 따로 있으면 key, 위치까지 필요하면 index()나 enumerate()를 사용합니다. 어떤 방법이든 빈 입력의 처리 규칙을 먼저 정해야 합니다.