반응형

문자열이나 List를 다룰때 종종 정렬을 해야할 때가 존재한다. 파이썬에서는 sorted() 함수를 통해 정렬를 할 수 있다.

아래와 같은 리스트를 정렬해보자.

logs = ['b_1', 'a_3', 'a_1', 'b_3', 'c_2', 'c_7', 'c_1', 'a_2', 'b_2']
result = sorted(logs)

# ['a_1', 'a_2', 'a_3', 'b_1', 'b_2', 'b_3', 'c_1', 'c_2', 'c_7']

 

정렬은 오름차순이 기본이고, 문자와 숫자가 같이있으면 숫자가 우선순위가 더 높다.

내림차순으로 변경하고 싶다면 reverse=True인자를 추가하면 된다.

result = sorted(logs, reverse=True)

# ['c_7', 'c_2', 'c_1', 'b_3', 'b_2', 'b_1', 'a_3', 'a_2', 'a_1']

 

리스트를 변수로 할당하였다면 접근제어자를 활용하여 sort()함수를 사용할 수도 있다.

logs.sort()

 

다중정렬을 하고싶을때는 lambda함수와 함께 사용하면 된다. 해당 리스트를 _를 기준으로 알파벳은 오름차순, 숫자는 내림차순 정렬을 해보자.

logs.sort(key=lambda x: (x.split('_')[0], -int(x.split('_')[1])))

# ['a_3', 'a_2', 'a_1', 'b_3', 'b_2', 'b_1', 'c_7', 'c_2', 'c_1']

 

key값에 lambda함수를 정의한다. 이때 정렬을 2번 이상 하는경우에는 튜플 형태로 감싸면 된다. 튜플의 앞쪽부터 순차적으로 정렬을 시작하게된다. 우선 logs의 각 문자열을 _를 기준으로 파싱한 후 앞쪽 문자열인 알파벳을 순서대로 정렬한다. 그 다음 뒤쪽 문자열인 숫자를 순서대로 정렬한다.

 

주의할점은 숫자도 문자열 형태로 존재하기 때문에 int로 형변환 후 정렬을 진행한다. -기호는 내림차순 정렬를 의미한다. 만약 알파벳을 내림차순, 숫자를 오름차순 정렬을 하고 싶다면 위와같은 형태로는 진행할 수 없다. 알파벳은 문자이기 때문에 - 기호를 붙일 수가 없기 때문이다. 따라서 정렬을 두번에 나누어서 진행한다.

logs.sort(key=lambda x:x.split('_')[0], reverse=True)
logs.sort(key=lambda x:x.split('_')[1])

# ['c_1', 'b_1', 'a_1', 'c_2', 'b_2', 'a_2', 'b_3', 'a_3', 'c_7']
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기