본문 바로가기

크래프톤 정글/TIL

[1주차] 파이썬 sort, sorted

백준에서 숫자와 문자열을 내 입맞대로 정렬하고자 

sort함수를 찾아보게 되었다.

단원이 정렬답게 버블정렬, 퀵정렬등을 써보려는 노력은 하였으나.... 첫번째 문제만 버블정렬 구현하고...! 나머지는 sort함수로 밀어 시간을 벌어보고자 한다.(정글에서의 시간은 24시간이 모자라...ㅠ)

 


sort함수와 sorted 함수의 차이

파이썬에서 리스트를 정렬하는 데에는 `sort()` 메서드와 `sorted()` 함수 두 가지 주요 방법이 있습니다. 이 두 방법은 다음과 같은 차이점이 있습니다:

sort() 함수

 

- 요약) `sort()` 메서드는 리스트를 제자리에서(in-place) 정렬합니다. 즉, 원래 리스트를 변경하고 정렬된 리스트로 대체합니다.
- 반환 값이 없습니다(None을 반환).
- 사용법:

my_list = [3, 1, 2]
my_list.sort()
print(my_list)  # [1, 2, 3]

 

sorted() 함수 

 

- 요약)`sorted()` 함수는 원본 리스트를 변경하지 않고 새로운 정렬된 리스트를 반환합니다.
- 원본 리스트는 그대로 유지됩니다.
- 반환 값은 정렬된 새로운 리스트입니다.
- 사용법:

my_list = [3, 1, 2]
sorted_list = sorted(my_list)
print(my_list)       # [3, 1, 2] (원본 리스트는 변경되지 않음)
print(sorted_list)   # [1, 2, 3] (새로운 정렬된 리스트)

정리) 
따라서, 어떤 방법을 선택할 것인지는 상황에 따라 다를 수 있습니다. 만약 원본 리스트를 정렬하고 그 결과에만 관심이 있다면 `sort()` 메서드를 사용하고, 원본 리스트를 보존하면서 정렬된 버전을 얻고 싶다면 `sorted()` 함수를 사용합니다.


기본적인 sort함수

1) 소문자 리스트.sort() = a, b, c 순으로 

my_list = ['a', 'p', 'p', 'l', 'e']
my_list.sort()
print(my_list)  # ['a', 'e', 'l', 'p', 'p']

2) 대문자 + 소문자 같이 있는 리스트.sort() = 대문자 A, B, C 순으로 -> 소문자 a, b , c순으로

my_list = ['a', 'p', 'P', 'l', 'E']
my_list.sort()
print(my_list)  # ['E', 'P', 'a', 'l', 'p']

즉, 아스키코드표대로 정렬된다.('대문자' +32 = '소문자'가 된다는 사실도 알아두면 좋다...!)

출처: https://stepbystep1.tistory.com/10

3) 오름차순/ 내림차순

3-1) 숫자 일때,

numbers = [10, 3, 7, 1, 8, 5, 6, 2]

# 숫자를 기준으로 오름차순 정렬
numbers.sort()
print(numbers)  # [1, 2, 3, 5, 6, 7, 8, 10]

# 숫자를 기준으로 내림차순 정렬
numbers.sort(reverse=True)
print(numbers)  # [10, 8, 7, 6, 5, 3, 2, 1]

3-2)문자열 일때,

fruits = ["apple", "banana", "cherry", "date", "fig"]

# 문자열의 길이를 기준으로 오름차순 정렬
fruits.sort(key=len)
print(fruits)   # ['fig', 'date', 'apple', 'banana', 'cherry']

# 문자열의 첫 글자를 기준으로 오름차순 정렬
fruits.sort(key=lambda x: x[0])
print(fruits)   # ['apple', 'banana', 'cherry', 'date', 'fig']

# 문자열 역순 정렬
fruits.sort(key=lambda x: x[::-1])
print(fruits)   # ['banana', 'apple', 'date', 'fig', 'cherry']

sort 함수에서 사용자가 정의한 기준에 따라 정렬하기 위해선 key값을 활용

1) 중복되는 문자열(숫자)을 제거하고자 할 때

my_list = ["apple","apple", "banana", "cherry", "date"]
new_list = set(my_list)
print(new_list)     

# 두개의 apple중 한개만 출력됨
# {'cherry', 'banana', 'apple', 'date'}

 

2) 문자열 길이를 기준으로 정렬하고자 할 때

# sort() 함수에서

my_list = ["apple", "banana", "cherry", "date"]
my_list.sort(key=len)
print(my_list)  # ['date', 'apple', 'cherry', 'banana']

# sorted() 함수에서

my_list = ["apple", "banana", "cherry", "date"]
new_my_list = sorted(my_list, key=len)
print(new_my_list)  # ['date', 'apple', 'cherry', 'banana']

3) 역순으로 정렬하고자 할 때

reverse = True 값을 사용

# sort() 함수에서

my_list = [3, 1, 2]
my_list.sort(reverse=True)
print(my_list)  # [3, 2, 1]

# sorted() 함수에서

my_list = [3, 1, 2]
reverse_sorted_list = sorted(my_list, reverse=True)
print(my_list)            # [3, 1, 2] (원본 리스트는 변경되지 않음)
print(reverse_sorted_list)  # [3, 2, 1] (새로운 역순으로 정렬된 리스트)