개발 꿀팁/PYTHON

python에서 sort와 sorted

Jammie 2022. 11. 24. 16:52
반응형

파이썬을 배우는 동안 파이썬의 정렬 상과 c++의 일반 알고리즘은 여전히 유사하지만 c++에 비해 더 간단하고 사용하기 쉽습니다.

파이썬의 내장된 함수 sort()는 목록의 요소를 정렬할 수 있는 반면 전역적인 sorted() 함수는 반복 가능한 모든 시퀀스에 적용할 수 있으며 sort() 함수는 현재 개체를 변경하는 내장 함수이며 sorted() 함수는 현재 개체를 변경하지 않고 정렬된 현재 개체의 복사본만 반환합니다.

1, 내장 함수 sort ( )

프로토타입: sort (fun, key, reverse=False)

매개 변수 fun은 이 sort 함수가 어떤 알고리즘에 기반하여 정렬되는지 나타냅니다. 일반적으로 기본값은 python에서 병합 정렬을 사용합니다. 일반적으로 이 매개 변수를 다시 쓸 수 없으므로 기본적으로 무시할 수 있습니다.

매개 변수 key는 모든 요소를 비교할 때 호출되는 함수를 지정하는 데 사용됩니다. 이 함수는 정렬 규칙을 나타냅니다. 즉, 어떤 규칙에 따라 순서를 정렬하는지를 나타냅니다.

매개변수 reverse는 역순서 여부를 나타내는 데 사용되며 기본 False의 경우 오름차순 규칙에 따라 정렬되며 reverse=True일 때 내림차순으로 정렬됩니다.

다음은 간단한 예를 통해 설명하겠습니다.

(개인적인 취미로 인해 나의 컴파일러는 pycharm이기 때문에 다음 모든 예시는 pycharm에서 실행할 수 있습니다.)

#coding:utf-8
from operator import attrgetter,itemgetter

list1 = [(2,'huan',23),(12,'the',14),(23,'liu',90)]

#기본적인 매개 변수를 사용하여 정렬하기, 즉 그룹 내 첫 번째 요소에 따라 정렬하기
list1.sort()
print list1
#출력 결과는 [(2, 'huan', 23), (12, 'the', 14), (23, 'liu', 90)]

#익명식 표현을 사용하여 key로 대표되는 함수를 다시 쓰고, 메타그룹의 두 번째 요소에 따라 순서를 매긴다.
list1.sort(key=lambda x:(x[1]))
print list1
#[(2, 'huan', 23), (23, 'liu', 90), (12, 'the', 14)]

#익명식 표현을 사용하여 key로 대표되는 함수를 다시 쓰고, 메타그룹의 세 번째 요소에 따라 순서를 매긴다.
list1.sort(key=lambda x:(x[2]))
print list1
#[(12, 'the', 14), (2, 'huan', 23), (23, 'liu', 90)]

#익명함수를 사용하여 key로 대표되는 함수를 다시 쓰고, 먼저 그룹 중 아래 2로 표시된 것에 따라 정렬한다.
# 아래 첨자 2에 있는 원소가 같으면, 아래 첨자 0에 있는 원소를 눌러 순위를 매긴다.
list1.sort(key=lambda x:(x[2],x[0]))
print list1
#[(12, 'the', 14), (2, 'huan', 23), (23, 'liu', 90)]

#operator 모듈의 itemgetter 함수를 사용하여 key가 나타내는 함수를 다시 쓰고, 1로 표시된 요소에 따라 정렬한다.
list1.sort(key=itemgetter(1))
print list1
#[(2, 'huan', 23), (23, 'liu', 90), (12, 'the', 14)]

#operator 모듈의 itemgetter 함수를 사용하여 key가 나타내는 함수를 다시 쓰고, 아래 2로 표시된 요소에 따라 정렬합니다.
list1.sort(key=itemgetter(2))
print list1
# # [(12, 'the', 14), (2, 'huan', 23), (23, 'liu', 90)]

# 여기에서 lambda의 정렬 방법을 유추할 수 있으므로, 더 이상 설명하지 않는다.
list1.sort(key=itemgetter(2,0))
print list1
#[(12, 'the', 14), (2, 'huan', 23), (23, 'liu', 90)]

위에서 언급한 익명 함수에 대해 여러분이 모르는 것이 있으면 스스로 이해할 수 있습니다. 여기서는 전개하지 않겠습니다.

여기서 나는 operator라는 모듈의 두 가지 함수에 대해 설명하려고 한다.

(1)itemgetter

operator.itemgetter (item) operator. itemgetter (*items) 이 함수는 들어오는 피연산자의 __getitem_() 메서드를 호출하여 item이 있는 호출 가능한 개체를 반환합니다. 만약 들어오는 인자가 여러 개일 경우, 하나의 메타그룹 유형이 있는 호출 가능한 개체를 반환합니다. 예를 들어 f = itemgetter(2), f(r)를 호출하면 r[2] g = itemgetter(2, 5, 3), g(r)를 호출하면 메타그룹으로 돌아갑니다. (r[2], r[5], r[3]). (2) attrgetter operator. attrgetter (attr) operator. attrgetter (*attrs) 이 함수는 연산자 속성의 attr 속성을 가진 호출 가능한 개체를 반환합니다.f = attrgetter('name'), f(b)를 호출하면 b.name. f = attrgetter('name', 'date'), f(b)를 호출하면 (b.name.first', 'name.last'), f(b)를 호출하면 (b.name.first', 'name.last')로 돌아갑니다.
2, 글로벌 함수 sorted ()

sorted()함수의 key의 개서에 대해서는 sort()함수와 같으므로 방금 sort()함수에 대해 설명한 방법은 모두 sorted()함수에 적용되며, 아래의 해석에서는 더 이상 열거하지 않으며, 다음에 설명할 key의 개서 역시 sort()함수에 적용되는데, 그렇다면 왜 sort()함수에 대해 다시 열거하지 않는가? 그것은 편향되지 않고 객관적으로 이해하기 위함이다.

다음은 여전히 한 가지 예에서 파고든다.

from operator import attrgetter
class Data:
article_name = str()
readers = 0
def __init__(self,tpl):
self.article_name = tpl[0]
self.readers = tpl[1]
def getKey(self):
return self.readers
def __str__(self):
return str(str(self.article_name)+str(':')+str(self.readers))

list1 = [Data(("java",100)),Data(("c++",100)),Data(("python",89)),Data(("c++",90))]

#여기서 attrgetter 함수를 호출하여 readers에 따라 정렬합니다
list2 = sorted(list1,key=attrgetter("readers"))
''' '''결과는
python:89
c++:90
java:100
c++:100
"""

#여기서 list1은 먼저 article_name에 따라 정렬하고, 이름이 같으면 readers에 따라 정렬합니다.
list3 = sorted(list1,key=attrgetter("article_name","readers"))
"""
결과는 다음과 같습니다.
c++:90
c++:100
java:100
python:89
"""

#클래스의 사용자 정의 함수를 사용하면 동일하게 동작할 수 있습니다
list4 = sorted(list1,key = Data.getKey)
"""
결과는 다음과 같습니다.
python:89
c++:90
java:100
c++:100
"""

위의 예시의 결과는 모두 인쇄를 통해 나온 결과입니다.
sorted() 함수에 대해서도 마찬가지로 sort() 함수에 소개된 방법을 사용할 수 있으므로 모두 스스로 시도할 수 있습니다.

물론 마지막으로 위의 모든 예에서 reverse 매개변수를 사용하지 않았으며 이 매개변수는 정렬의 방향을 제어하는 데 사용되므로 여러분 스스로 시도해 보십시오. 여기서는 소개하지 않겠습니다

 

반응형