파이썬 두 기준 정렬, 길이는 내림차순·이름은 오름차순

이 카테고리 글 목록

전체글 보기

길이는 내림차순, 같은 길이의 이름은 오름차순으로 정렬하려면 key=lambda row: (-row["height"], row["name"])를 쓰세요. 숫자인 길이에만 음수를 붙여 첫 기준의 방향을 바꾸고, 이름은 그대로 두면 됩니다.

아래는 길이를 cm로 적은 가상 식물 기록입니다. 각 항목의 height는 유한한 숫자이고 name은 문자열입니다.

records = [
    {"name": "민트", "height": 18},
    {"name": "로즈마리", "height": 25},
    {"name": "바질", "height": 18},
    {"name": "타임", "height": 12},
]
ordered = sorted(records, key=lambda row: (-row["height"], row["name"]))

print("길이 내림차순, 이름 오름차순")
for row in ordered:
    print(row["name"], row["height"])
길이 내림차순, 이름 오름차순
로즈마리 25
민트 18
바질 18
타임 12

튜플은 왼쪽 값부터 비교하고, 그 값이 같을 때 다음 값을 비교합니다. 길이 25, 18, 12에 대응하는 첫 키는 -25, -18, -12입니다. 이를 작은 순서로 정렬하면 원래 길이는 큰 순서로 놓입니다. 길이가 18로 같은 두 항목에서만 이름을 비교하므로 민트가 바질보다 먼저 나옵니다.

reverse=True만 쓰면 이름도 내림차순이 됩니다

양수 길이와 이름을 묶은 키에 reverse=True를 주면 튜플 비교 전체가 내림차순이 됩니다. 같은 가상 기록으로 확인하면 길이가 같은 두 이름의 순서가 달라집니다.

records = [
    {"name": "민트", "height": 18},
    {"name": "로즈마리", "height": 25},
    {"name": "바질", "height": 18},
    {"name": "타임", "height": 12},
]
ordered = sorted(
    records,
    key=lambda row: (row["height"], row["name"]),
    reverse=True,
)

print("길이와 이름 모두 내림차순")
for row in ordered:
    print(row["name"], row["height"])
길이와 이름 모두 내림차순
로즈마리 25
바질 18
민트 18
타임 12

첫 예제의 (-height, name)은 길이 기준만 뒤집습니다. 두 번째 예제는 (height, name) 전체를 내림차순으로 비교해서 바질이 민트보다 먼저 나왔습니다.

이 방식은 숫자 길이에 음수를 붙일 수 있고, 모든 항목에 두 키가 있다는 전제입니다. 빠진 키를 읽으면 KeyError가 발생합니다. height가 "18" 같은 문자열이면 음수 연산에서 TypeError가 발생합니다. 이름은 Python의 문자열 비교 순서를 따릅니다. 언어·지역별 이름 정렬 규칙이 필요하다면 별도 기준을 정해야 합니다.

sorted()는 정렬한 새 리스트를 반환합니다. 원래 목록 자체를 바꾸려면 sorted와 list.sort의 반환값·변경 차이를 참고하세요.

가상 기록은 Windows의 Python 3.14.3에서 실행했습니다. Python 정렬 안내의 방향 설정과 튜플 비교 순서 설명에서 근거를 확인할 수 있습니다.

이 카테고리의 다른 글

전체글 보기

“파이썬 두 기준 정렬, 길이는 내림차순·이름은 오름차순”에 대한 1개의 생각

댓글 남기기