본문으로 건너뛰기

교육 ·

비전공자 파이썬 정렬 함수 배우는 법, 엑셀 정렬과 뭐가 다른가요

비전공자 파이썬 정렬 함수 배우는 법, 왜 따로 배워야 하나요

엑셀에서 정렬은 메뉴 클릭 몇 번이면 끝나지만, 파이썬으로 자동화 스크립트를 짜다 보면 리스트나 데이터프레임을 코드 안에서 직접 정렬해야 하는 순간이 반드시 옵니다. 파이썬 정렬 함수는 크게 sort()sorted() 두 가지이고, 이 둘의 차이와 key 옵션만 이해하면 실무에서 필요한 정렬은 대부분 해결됩니다. 엑셀 정렬처럼 마우스로 클릭하는 대신 코드 한두 줄로 정렬 기준을 바꿀 수 있다는 점이 가장 큰 차이입니다.

비전공 사무직을 위한 코딩 입문 로드맵에서 다룬 것처럼, 파이썬 학습은 항상 “내 업무의 어떤 반복을 자동화할 것인가”에서 출발해야 합니다. 정렬 함수도 마찬가지입니다. 매달 거래처별 매출 순위를 손으로 재배치하거나, 명단을 가나다순으로 다시 정리하는 작업을 반복하고 있다면 이 글이 그 시작점이 될 수 있습니다.

sort()와 sorted(), 뭐가 다른가요

sort()는 리스트 자체를 바꿔버리고, sorted()는 원본은 그대로 두고 정렬된 새 리스트를 돌려줍니다. 원본 데이터를 나중에 다시 써야 한다면 sorted()를, 더 이상 원본이 필요 없다면 sort()를 쓰면 됩니다. 실무에서는 원본을 보존해야 하는 경우가 많아 sorted()를 더 자주 사용하게 됩니다.

매출 = [320, 150, 480, 90, 275]

# sort()는 원본 리스트 자체를 변경
매출.sort()
print(매출)  # [90, 150, 275, 320, 480]

# sorted()는 원본은 그대로 두고 새 리스트 반환
매출2 = [320, 150, 480, 90, 275]
정렬된매출 = sorted(매출2)
print(매출2)      # [320, 150, 480, 90, 275] (변화 없음)
print(정렬된매출)  # [90, 150, 275, 320, 480]

내림차순으로 정렬하려면 reverse=True 옵션을 추가하면 됩니다.

매출_내림차순 = sorted(매출2, reverse=True)
print(매출_내림차순)  # [480, 320, 275, 150, 90]

파이썬 정렬 함수 핵심 정리

거래처명이나 이름 기준으로 정렬하려면 어떻게 하나요

숫자 정렬은 위 예시처럼 간단하지만, 실무에서는 딕셔너리나 튜플로 이루어진 데이터를 특정 항목 기준으로 정렬해야 하는 경우가 훨씬 많습니다. 이때 사용하는 것이 key 옵션입니다. 정렬 기준이 되는 값을 함수 형태로 지정해주면, 파이썬이 그 기준에 맞춰 전체를 재배열합니다.

예를 들어 거래처별 매출 데이터가 다음과 같은 딕셔너리 리스트로 있다고 가정해봅시다.

거래처목록 = [
    {"이름": "가나상사", "매출": 320},
    {"이름": "다라물산", "매출": 150},
    {"이름": "마바기업", "매출": 480},
]

# 매출 기준 내림차순 정렬
매출순 = sorted(거래처목록, key=lambda x: x["매출"], reverse=True)
for 거래처 in 매출순:
    print(거래처["이름"], 거래처["매출"])

# 실행 결과
# 마바기업 480
# 가나상사 320
# 다라물산 150

여기서 lambda x: x["매출"]은 “각 항목에서 매출 값을 꺼내 그 값을 기준으로 정렬하라”는 뜻입니다. lambda가 낯설다면 비전공자 파이썬 함수 입문 글에서 함수의 기본 개념부터 확인하시는 것을 권해드립니다. 함수를 이해하고 나면 lambda는 이름 없이 한 줄로 쓰는 함수일 뿐이라는 것이 훨씬 쉽게 와닿습니다.

이름 기준으로 정렬하고 싶다면 key만 바꾸면 됩니다.

이름순 = sorted(거래처목록, key=lambda x: x["이름"])

여러 조건으로 정렬하고 싶을 때는 어떻게 하나요

부서별로 먼저 묶고, 같은 부서 안에서는 매출 순으로 정렬하고 싶은 경우처럼 정렬 조건이 두 개 이상일 때는 key에 튜플을 넘기면 됩니다. 튜플의 앞쪽 값이 먼저 비교되고, 값이 같을 때만 뒤쪽 값이 비교 기준으로 사용됩니다.

직원목록 = [
    {"부서": "영업", "이름": "홍길동", "매출": 200},
    {"부서": "영업", "이름": "김철수", "매출": 350},
    {"부서": "총무", "이름": "이영희", "매출": 100},
]

정렬결과 = sorted(직원목록, key=lambda x: (x["부서"], -x["매출"]))
for 직원 in 정렬결과:
    print(직원["부서"], 직원["이름"], 직원["매출"])

# 실행 결과
# 영업 김철수 350
# 영업 홍길동 200
# 총무 이영희 100

매출 앞에 마이너스 부호를 붙인 것은 숫자를 내림차순으로 만들기 위한 실무 요령입니다. 문자열에는 마이너스를 쓸 수 없으므로, 문자열 기준을 내림차순으로 하고 싶다면 sorted()를 두 번 나눠 적용하거나 reverse 옵션을 조합하는 방식으로 처리합니다.

엑셀 표를 다룰 때는 pandas 정렬을 쓰세요

엑셀 파일을 읽어와 pandas 데이터프레임으로 다루는 경우라면 리스트 정렬 대신 sort_values()를 사용하는 편이 훨씬 간단합니다. 여러 엑셀 파일을 취합해 자동화하는 업무를 이미 엑셀 반복 업무, 파이썬으로 10분 만에 끝내기 글에서 다뤄본 분이라면 자연스럽게 이어지는 단계입니다.

import pandas as pd

df = pd.read_excel("거래처매출.xlsx")

# 매출 기준 내림차순 정렬
df_정렬 = df.sort_values(by="매출", ascending=False)

# 부서, 매출 두 기준으로 정렬
df_정렬2 = df.sort_values(by=["부서", "매출"], ascending=[True, False])

sort_values()by는 리스트로 여러 열을 지정할 수 있고, ascending도 열마다 오름차순·내림차순을 따로 지정할 수 있습니다. 리스트 정렬에서 배운 key 개념과 원리는 같지만, 표 형태 데이터에서는 pandas 쪽이 코드가 더 짧고 읽기 쉽습니다.

정렬 함수를 배울 때 자주 하는 실수

정렬 함수 자체는 어렵지 않지만 실무에서는 몇 가지 실수가 반복됩니다. 첫째, sort()를 쓰고 나서 원본 리스트가 필요했는데 이미 바뀌어버린 경우입니다. 정렬 전에 원본을 다른 변수에 복사해두거나 처음부터 sorted()를 쓰는 습관을 들이는 것이 안전합니다. 둘째, 숫자처럼 보이지만 실제로는 문자열로 저장된 데이터를 정렬해서 “10”이 “2”보다 앞에 오는 이상한 결과를 얻는 경우입니다. 이럴 때는 정렬 전에 int()float()로 형 변환을 해줘야 합니다. 셋째, key에 넘긴 lambda 안에서 존재하지 않는 딕셔너리 키를 참조해 에러가 나는 경우인데, 에러 메시지를 무서워하지 말고 비전공자를 위한 에러 메시지 읽는 법에서 다룬 방식대로 차근차근 읽으면 원인을 쉽게 찾을 수 있습니다.

마무리하며

정렬은 화려한 기능은 아니지만 데이터 자동화 스크립트에서 거의 빠지지 않고 등장하는 작업입니다. sorted()와 key 옵션 하나만 제대로 익혀두면 순위표 만들기, 명단 정리, 보고서 자동 생성처럼 실무에서 반복되는 작업의 상당 부분을 처리할 수 있습니다. 픽셀앤코드는 이런 비전공자 실무자를 위한 파이썬 데이터 처리 교육과, 학습 이후 실제 업무 자동화 도입까지 이어지는 컨설팅을 함께 제공하고 있으니, 사내 교육이나 자동화 도입을 고민하고 계시다면 편하게 문의해주시기 바랍니다.