2009-12-16 2 views
58

documentation은이를 보장하지 않습니다. 문서화 된 다른 곳이 있습니까?python의 sorted() 함수는 안정적입니까?

목록의 정렬 방법이 guaranteed to be stable (메모 9 번째 점 : "sort() 메서드가 안정적으로 작동한다는 보장") 이후 안정적이라고 생각합니다. 정렬은 기능적으로 유사합니다. 그러나 나는 그렇게 말하는 확실한 근원을 찾을 수 없다.

목적 : 두 레코드에서 기본 키가 같은 경우 기본 키와 보조 키를 기준으로 정렬해야합니다. sorted()가 안정적인 것으로 보장되면 보조 키를 정렬하고 기본 키를 정렬하여 필요한 결과를 얻을 수 있습니다.

추 신 : 혼란을 피하기 위해 "평등을 비교하는 요소의 상대적인 순서를 변경하지 않도록 보장하면 정렬이 안정적입니다."라는 의미에서 안정을 사용하고 있습니다.

답변

78

예, 설명서의 의도는 실제로 sorted이 안정적이고 실제로는 sort 메서드와 정확히 동일한 알고리즘을 사용한다는 것을 보장합니다. 나는이 신원에 대해 문서가 100 % 명확하지 않다는 것을 알고있다. 의사 패치는 항상 행복하게 받아 들여집니다!

+2

내가 튜플이나 목록을 정렬하는 경우 "기본"정렬 키가 동일 할 때마다 "보조"키로 정렬됩니다. 예를 들어,'sorted ([(1,2), (1,1)])'은 원래의 입력을 동일한 순서/순서로 반환하는 대신에 [(1,1), (1, 2)]'를 반환합니다. 안정성의 보장이 원래'[(1,2), (1,1)] 입력을 돌려줘야한다는 것을 의미합니까? 이 경우에 당신은 분명하고''((1, 2), (1, 1)) key = lambda t : t [0])' – ray

+1

이 경우에 기대되는 것이 아닌가? 파이썬은 기본적으로 첫 번째 "기본"요소가 아닌 모든 요소를 ​​통해 튜플을 비교합니다. 첫 번째 요소 만 정렬하려면'key' 매개 변수를 명시 적으로 전달하면됩니다. –

0

"What's New" docs for Python 2.4은 효과적으로 sorted()가 먼저 목록을 만든 다음이를 sort()를 호출하여 "공식"문서가 아닌 필요한 보증을 제공합니다. 당신이 정말로 염려한다면, 당신은 또한 소스를 확인할 수 있습니다.

+1

어디서 그렇게 말할까요? sorted()는 "in place place.sort()"와 "new formed copy is sorted"와 같이 작동하지만 내부적으로 sort()를 사용하는 것은 아닙니다. – sundar

+0

형성된 "복사"는 목록입니다 (반환 값으로 얻는 것입니다). 반환 전에 .sort()가 해당 목록에서 호출됩니다. QED. 아니, 그것은 증명할 수있는 증거는 아니지만, 파이썬이 공식 표준을 가질 때까지는 그것을 얻지 못할 것입니다. –

21

이들은 stable입니다. 여러 개의 키가있을 때 두 단계로 정렬 할 필요가 없기 때문에 정렬 및 정렬이 안정적인지 알 필요가 없지만. 예를 들어

, 당신이 그들의 last_name, first_name 속성을 기준으로 개체를 정렬하려면 다음을 수행 할 수 있습니다 튜플 비교를 활용

sorted_list= sorted(
    your_sequence_of_items, 
    key= lambda item: (item.last_name, item.first_name)) 

.

이 답변은있는 그대로 원래 질문을 다루고 있습니다. 추가 정렬 관련 질문은 Python Sorting How-To입니다.

+4

정렬을 취소하려는 경우 바람직하지 않은 영향을 줄 수 있습니다. 예를 들어 제품 정렬시 등급 (오름차순)과 가격 (오름차순)을 먼저 정렬 할 수 있습니다. 이것을 역순으로하면 내림차순으로 정렬하고 오름차순으로 정렬합니다. 이 솔루션에서는 작동하지 않습니다. –

+2

@RemcoWendt : 당신이 묘사하는 것에 대한 요구 사항은 없었습니다. 어쨌든,'key = lambda item : (-item.rating, item.price)'를 고려하거나'key' 인자 대신'cmp'를 제공하십시오. 그래도 난 당신의 의견의 목적에 대해 확신하지 못합니다. – tzot

+1

사실 그것은 요구 사항은 아니지만 다른 사람들이 이것을 읽고 솔루션을 선택하거나 Python의 안정적인 정렬 기능을 사용할 때이 미묘한 차이점을 지적하고 싶었습니다. –

1

그것은 아마도 그 동안 변경되었지만 sorted의 현재 문서는 명시 적으로 garantuees 다음은 내장 sorted() 기능을 안정적으로 보장

. 정렬은 동일하다고 비교되는 요소의 상대적 순서를 변경하지 않을 경우 안정적입니다. 이는 여러 패스에서 정렬하는 데 유용합니다 (예 : 부서별, 급여 등급 별 정렬).