supergravity

파이썬 - sorted() 본문

콘텐츠/파이썬-알고리즘 기초_ 2021

파이썬 - sorted()

supergravity 2021. 10. 26. 18:33

목차

-시작

-기본

-lambda 함수

-거꾸로 정렬

-2중 정렬, 다중 정렬

-문제

 

시작

파이썬 내장함수인 sorted를 잘 활용하면.

정렬관련 문제는 거뜬히 해결할 수 있습니다.

sorted는 여러개의 조건을 충족시키는 정렬을 진행할 수 있는데.

이 기능은 간결한 코드로 문제를 해결할 수 있는 실마리를 제공합니다.

그러면 시작해 봅시다.

 

기본

sorted()는 리스트와 같은 반복가능한 객체를 파라매터로 받고.

이를 정렬된 리스트로 리턴합니다.

 

sorted()는 파라매터로 반복가능한 객체 iterable을 받기때문에.

dictionary, set, tuble, string, generator 모두 사용이 가능합니다.

 

a = [1,3,1,2,3,4,56,6,2,8,3,7,6 ]   
print(sorted(a))

---> 출력결과
[1, 1, 2, 2, 3, 3, 3, 4, 6, 6, 7, 8, 56]

print(sorted({1: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'}))

---> 출력결과
[1, 2, 3, 4, 5]

key

key는 정렬시 조건을 주고 싶을때 사용합니다.

sorted(iterable, key = 함수) 조건은 key = 뒤에 함수를 작성하여 사용합니다.

통상적으로 key의 함수를 작성할때 lambda 방법을 사용하여 작성합니다.

그러면 예를 한번 봐봅시다.

a = [1,3,1,2,3,4,56,6,2,8,3,7,6 ]   
b = sorted(a, key = lambda x : x)
print(b)
c = sorted(a, key = lambda x : -x)
print(c)

---> 출력결과
[1, 1, 2, 2, 3, 3, 3, 4, 6, 6, 7, 8, 56]
[56, 8, 7, 6, 6, 4, 3, 3, 3, 2, 2, 1, 1]

key뒤에 함수는 iterable의 성분을 파라매터로 받습니다.

b의 경우 a리스트의 성분인 x를 파라매터로 받고.

이를 기준으로 정렬하여 sorted(a)와 같은 결과를 리턴하고 있습니다.

c의 경우 a리스트의 성분인 1,3,1 ...을 파라매터로 받고.

이에 -1을 곱한것 기준으로 정렬한 결과입니다.

그래서 내림차순으로 정렬이 되고 있습니다.

 

자 그러면 이제 좀더 복잡한 경우에 대해서 다루어 봅시다.

학생들의 리스트이고 0번에 이름, 1번에 등급, 3번에 성적이 들어 있는 튜플로 구성이 되어있습니다.

key와 lambda함수를 이용하면.

각각 기준별로 정렬할 수 있습니다.

student_tuples = [
    ('g', 'A', 15),
    ('a', 'B', 12),
    ('c', 'B', 10),
]

print(sorted(student_tuples, key =lambda x : x[0]))
print(sorted(student_tuples, key =lambda x : x[1]))
print(sorted(student_tuples, key =lambda x : x[2]))


----> 출력결과
[('a', 'B', 12), ('c', 'B', 10), ('g', 'A', 15)]
[('g', 'A', 15), ('a', 'B', 12), ('c', 'B', 10)]
[('c', 'B', 10), ('a', 'B', 12), ('g', 'A', 15)]

이번에는 -를 사용하지 않았는데.

-를 사용하면 역순으로 된 결과를 얻을 수 있습니다.

 

sring도 튜플과 같은 방법으로 정렬할 수 있습니다.

student_tuples = [
    'gA5',
    'aB12',
    'cB10',
]

print(sorted(student_tuples, key =lambda x : x[0]))
print(sorted(student_tuples, key =lambda x : x[1]))
print(sorted(student_tuples, key =lambda x : x[2]))


----> 출력결과
['aB12', 'cB10', 'gA5']
['gA5', 'aB12', 'cB10']
['aB12', 'cB10', 'gA5']

정렬 안정성

튜플이나 스트링 같은 2개 이상의 정렬을 key를 이용하여 정렬할때.

고려되지 않는 index들이 있습니다.

예를 들어 아래와 같은경우 0번째를 기준으로 정렬을 합니다.

1번째는 고려되지 않습니다.

이처럼 고려되지 않는 index에 대해서는 원래의 정렬 순서를 유지합니다.

data = [('r', 3), ('b', 3), ('r', 2), ('b', 2)]
print(sorted(data, key= lambda x : x[0]))

--->출력결과
[('b', 3), ('b', 2), ('r', 3), ('r', 2)]

0를 기준으로 정렬하기에 b가 r보다 앞에 존재합니다.

('b', 3), ('b', 2)의 정렬 순서는 data를 살펴보면 ('b', 3)이  ('b', 2)보다 앞에 존재하는 것을 확인할 수 있습니다.

그래서 출력결과는 ('b', 3), ('b', 2)순으로 되어 있습니다.

이러한 특징을 정렬 안정성이라 합니다.

 

2중 정렬, 다중 정렬

아까 예를 들었던 학생들을 정렬하는 예를 다시 생각해보자.

student_tuples = [
    ('g', 'A', 15),
    ('a', 'B', 12),
    ('c', 'B', 10),
]

print(sorted(student_tuples, key =lambda x : x[0]))

과거에 시험성적을 받으면.

우선적으로 성적순으로 정렬이되고.

그다음으로 이름순으로 정렬된 성적표를 본적이 있을 것입니다.

 

이러한 상황에서는 튜플을 사용하면 해결가능 합니다.

상황을 정확하게 이해할 수 있도록 예제를 업데이트했습니다.

student_tuples = [
    ('g', 'A', 15),
    ('a', 'A', 15),
    ('b', 'B', 15),
    ('a', 'B', 12),
    ('c', 'B', 10),
]

print(sorted(student_tuples, key =lambda x :(-x[2], x[0])))

---> 출력결과

[('a', 'A', 15), ('b', 'B', 15), ('g', 'A', 15), ('a', 'B', 12), ('c', 'B', 10)]

출력 결과를 보면 점수를 우선으로 정렬이 되었고.

같은 점수 에서는 이름순으로 정렬이 된 것을 볼 수 있습니다.

문제

가장큰수

https://programmers.co.kr/learn/courses/30/lessons/42746

 

코딩테스트 연습 - 가장 큰 수

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰

programmers.co.kr

 

 

이전 글 - 파이썬 순열 조합

다음 글 - 파이썬  재귀함수

Comments