source

사용자 정의 비교 기능을 사용하여 목록 정렬

nicesource 2023. 4. 14. 21:55
반응형

사용자 정의 비교 기능을 사용하여 목록 정렬

이런 이름이 붙은 질문이 여러 개 있는 건 알지만, 저한테는 안 맞는 것 같아요.

50 x 5 요소 리스트가 있습니다.각 요소에 커스텀 비교 기능을 적용하여 이 목록을 정렬하고 싶습니다.이 함수는 요소를 정렬하는 기준 목록의 적합성을 계산합니다.비교와 피트니스라는 두 가지 기능을 만들었습니다.

def compare(item1, item2):
    return (fitness(item1) < fitness(item2))

그리고.

def fitness(item):
    return item[0]+item[1]+item[2]+item[3]+item[4]

그리고 나서 나는 그들에게 전화를 걸려고 했다.

sorted(mylist, cmp=compare)

또는

sorted(mylist, key=fitness)

또는

sorted(mylist, cmp=compare, key=fitness)

또는

sorted(mylist, cmp=lambda x,y: compare(x,y))

또한 동일한 파라미터로 list.sort()를 시도했습니다.그러나 어떤 경우에도 함수는 인수로 목록을 얻는 것이 아니라None대부분의 경우 C++에서 나오는 콜백 함수와 모순되는 이유를 알 수 없습니다.커스텀 함수를 사용하여 이 목록을 정렬하려면 어떻게 해야 합니까?

편집 실수를 찾았습니다.원래 목록을 만든 체인에서 하나의 함수는 아무것도 반환하지 않았지만 반환 값이 사용되었습니다.귀찮게 해서 죄송합니다.

또한 비교 함수가 올바르지 않습니다.부울이 아닌 -1, 0 또는 1을 반환해야 합니다.올바른 비교 기능은 다음과 같습니다.

def compare(item1, item2):
    if fitness(item1) < fitness(item2):
        return -1
    elif fitness(item1) > fitness(item2):
        return 1
    else:
        return 0

# Calling
list.sort(key=compare)

OP에서 커스텀 비교 기능을 사용할 것을 요청했기 때문에(이것이 바로 이 질문으로 이어졌습니다), 여기서 확실한 답변을 드리겠습니다.

일반적으로 빌트인을 사용합니다.sorted()사용자 지정 비교기를 매개 변수로 사용하는 함수입니다.Python 3에서는 파라미터 이름과 시멘틱스가 변경되었다는 점에 유의할 필요가 있습니다.

사용자 정의 비교기 작동 방식

커스텀 컴퍼레이터를 제공할 때는 일반적으로 (대부분의 다른 프로그래밍 언어 및 프레임워크와 마찬가지로) 다음 패턴을 따르는 정수/플로트 값을 반환해야 합니다.

  • 음의 값을 반환하다< 0왼쪽 항목을 오른쪽 항목보다 먼저 정렬해야 하는 경우)
  • 양의 값을 반환하다> 0왼쪽 항목을 오른쪽 항목 다음에 정렬해야 하는 경우)
  • 돌아가다0왼쪽과 오른쪽 항목이 모두 같은 무게를 가지며 우선 순위 없이 "순서"를 받아야 하는 경우

OP 질문의 특정 경우 다음과 같은 사용자 정의 비교 기능을 사용할 수 있습니다.

def compare(item1, item2):
    return fitness(item1) - fitness(item2)

마이너스 연산을 사용하는 것은 왼쪽 무게에서 양의 값이 산출되기 때문에 유용한 방법입니다.item1 item2 .이런 이유로item1다음에 정렬됩니다. item2.

순서를 ,로 해 .return fitness(item2) - fitness(item1)

Python 2에서 sorted() 호출

sorted(mylist, cmp=compare)

또는 다음과 같이 입력합니다.

sorted(mylist, cmp=lambda item1, item2: fitness(item1) - fitness(item2))

Python 3에서 sorted() 호출

from functools import cmp_to_key
sorted(mylist, key=cmp_to_key(compare))

또는 다음과 같이 입력합니다.

from functools import cmp_to_key
sorted(mylist, key=cmp_to_key(lambda item1, item2: fitness(item1) - fitness(item2)))

요.compare하여 사용하다functools.cmp_to_keysorted 「 」:

import functools

lst = [list(range(i, i+5)) for i in range(5, 1, -1)]

def fitness(item):
    return item[0]+item[1]+item[2]+item[3]+item[4]
def compare(item1, item2):
    return fitness(item1) - fitness(item2)

sorted(lst, key=functools.cmp_to_key(compare))

출력:

[[2, 3, 4, 5, 6], [3, 4, 5, 6, 7], [4, 5, 6, 7, 8], [5, 6, 7, 8, 9]]

작업:)

>>> l = [list(range(i, i+4)) for i in range(10,1,-1)]
>>> l
[[10, 11, 12, 13], [9, 10, 11, 12], [8, 9, 10, 11], [7, 8, 9, 10], [6, 7, 8, 9], [5, 6, 7, 8], [4, 5, 6, 7], [3, 4, 5, 6], [2, 3, 4, 5]]
>>> sorted(l, key=sum)
[[2, 3, 4, 5], [3, 4, 5, 6], [4, 5, 6, 7], [5, 6, 7, 8], [6, 7, 8, 9], [7, 8, 9, 10], [8, 9, 10, 11], [9, 10, 11, 12], [10, 11, 12, 13]]

이상과 같습니다.뭔가 다른 일을 하고 있나요?

'먹다' 입니다.sum

알 수 있는 중 하나는, 「」로, 「」라고 하는 입니다.sorted() (오류)list.sort()Python은 Python을 사용합니다.목록 요소를 통과하는 단일 경로로 키 목록을 작성합니다.그 후, 어느 키가 큰지 작은지를 판단해, 올바른 순서로 배치합니다.

그래서 제가 찾은 해결책은 올바른 순서를 주는 열쇠를 만드는 것이었습니다.를 Python으로 할 수 .str ★★★★★★★★★★★★★★★★★」tuple은 .가 .functools다음과 같이 합니다.

# task: sort the list of strings, such that items listed as '_fw' come before '_bw'
foolist = ['Goo_fw', 'Goo_bw', 'Foo_fw', 'Foo_bw', 'Boo_fw', 'Boo_bw']

def sortfoo(s):
    s1, s2 = s.split('_')
    r = 1 if s2 == 'fw' else 2     # forces 'fw' to come before 'bw'
    return (r, s1)                 # order first by 'fw'/'bw', then by name

foolist.sort(key=sortfoo)          # sorts foolist inplace

print(foolist)
# prints:
# ['Boo_fw', 'Foo_fw', 'Goo_fw', 'Boo_bw', 'Foo_bw', 'Goo_bw']

이것은 태플이 정렬에 사용하는 법적 키이기 때문에 작동합니다.이 탭은 필요에 따라 커스터마이즈할 수 있습니다.각각의 정렬 요소가 정렬의 중요도에 따라 이 튜플에 쌓이기만 하면 됩니다.

비교 함수별로 목록을 정렬할 때 우연히 이 스레드를 발견했습니다.python을 처음 사용하거나 c++ 배경에서 온 모든 사용자에게 적합합니다.여기서 c++와 같은 콜백 함수를 사용하여 복제하려고 합니다.이것을 sorted() 함수로 시도했습니다.

예를 들어, 이 리스트를 마크(오름차순)에 따라 정렬하고 마크가 같으면 이름(오름차순)으로 정렬합니다.

students= [['Harry', 37.21], ['Berry', 37.21], ['Tina', 37.2], ['Akriti', 41.0], ['Harsh', 39.0]]

def compare(e):
  return (e[1],e[0])

students = sorted(students,key=compare)

정렬 후:

[['Tina', 37.2], ['Berry', 37.21], ['Harry', 37.21], ['Harsh', 39.0], ['Akriti', 41.0]]

python3x의 경우

arr = [1, 33, 23, 56, 9]

def compare_func(x, y):
     return x - y

1. 비교 기능이 있는 ar.sort 사용

arr.sort(key=cmp_to_key(compare_func))

사용 2. 사용sorted목록을 얻기 위해

new_list = sorted(arr, key=cmp_to_key(lambda x, y: x - y)))

3. 람다와 함께 ar.sort를 사용한다.

arr.sort(key=cmp_to_key(lambda x, y: x - y))

언급URL : https://stackoverflow.com/questions/5213033/sort-a-list-of-lists-with-a-custom-compare-function

반응형