백준 10814번 문제를 해결하면서, 파이썬에서 리스트와(sort) 이터러블을(sorted) 배열하는 함수에 어떤 기준을 부여하여 원하는 대로 정렬할 수 있다는 것을 알게 되어 응용하였다.
또한 sorted와 sort에서 key 매개변수를 사용하는 방법은 동일하다.
# key 매개변수에 내장 함수 사용
print(list(sorted("This is a test string from Andrew".split(), key=str.lower)))
위는 대소문자를 사용하지 않는 문자열 비교의 예시이다.
key는 정렬 기준을 지정하는 매개변수이다. 위 코드의 key=str.lower는 sorted 함수에 전달된 단어를(.split()으로 인해 문자열이 공백을 기준으로 분리되어 문자열 -> 단어화) 소문자로 만들고 그 값을 기준으로 정렬한다는 의미이다.
그래서 결과는 다음과 같다.
['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']
# key 매개변수에 lambda 예약어 사용
lambda 예약어의 사용으로 이렇게 리스트 내 요소가 또 다른 리스트나 튜플일 때 (여러 개의 값이 들어 있는 요소를 정렬할 때) 여러 개의 값 중 어떤 요소를 기준으로 정렬할지를 정해줄 수 있다.
members = []
for i in range(N):
age, name = input().split()
members.append((int(age), name))
members.sort(key= lambda x: x[0])
for j in range(N):
print(*members[j])
위의 코드는 10814번 문제인데, members 리스트에 (나이, 이름) 이 튜플 형식으로 저장된다.
입력이 아래와 같다면,
3
21 Junkyu
21 Dohyun
20 Sunyoung
members 리스트는 아래와 같은 값을 가지게 된다.
[(20, 'Sunyoung'), (21, 'Junkyu'), (21, 'Dohyun')]
이 리스트를 정렬할 때 members.sort(key= lambda x: x[0]) 를 적용하면,
key(정렬의 기준)는 x이고, x는 튜플의 0번째 요소이다
= 튜플의 0번째 요소가 정렬의 기준이다
이것이 적용되어 나이를 기준으로 정렬된다.
아래는 코드의 출력이다.
20 Sunyoung
21 Junkyu
21 Dohyun
사실 그냥 key를 사용하지 않고 sorted를 사용해도 나이 순으로 배열이 되는 것처럼 보인다.
하지만 10814번 문제는 "나이가 같으면 가입한 순으로" 배열해야 하는 조건이 있다.
그래서 key를 사용하지 않으면 나이가 같을 때 가입한 순으로 정렬되지 않고, 알파벳 순서대로 오름차순 정렬되어 오답이 된다. 덕분에 sorted와 sort를 사용할 때 매개변수 key를 사용할 수 있다는 것을 알게 되었다.
# 참고
Sorting HOW TO
Author, Andrew Dalke and Raymond Hettinger,, Release, 0.1,. Python lists have a built-in list.sort() method that modifies the list in-place. There is also a sorted() built-in function that builds a...
docs.python.org
추가. sort() 함수에서 key 사용하기 : 길이순 정렬
백준 1181번 문제를 해결하면서 문자열의 길이 순으로 list를 정렬하는 방법을 찾고 있었는데,
sorted를 사용하면 key를 len으로 가져갈 수 없었다.
이것이 sort(key=len)을 사용하면 해결된다는 것을 알게 되어 내용 추가한다.
n = int(input())
words = []
for i in range(0, n):
words.append(input()) # 단어 입력받기
print(words)
words = list(set(words))
words.sort(key=len)
print(words)
'Python' 카테고리의 다른 글
[Python] collections.deque 모듈과 요세푸스 문제 (0) | 2024.02.21 |
---|---|
[Python] 문자열 함수와 반올림에 대해서 (0) | 2023.10.09 |
[Python] 백준 10989 메모리 초과와 시간 초과 (0) | 2023.08.29 |
[Python] list 관련 내용 돌아보기 (0) | 2023.08.26 |