programing

파이썬 3에서 사용자 정의 비교 기능을 사용하는 방법은 무엇입니까?

elecom 2023. 6. 17. 08:16
반응형

파이썬 3에서 사용자 정의 비교 기능을 사용하는 방법은 무엇입니까?

Python 2.x에서는 사용자 정의 함수를 sorted 및 .sort 함수로 전달할 수 있었습니다.

>>> x=['kar','htar','har','ar']
>>>
>>> sorted(x)
['ar', 'har', 'htar', 'kar']
>>> 
>>> sorted(x,cmp=customsort)
['kar', 'htar', 'har', 'ar']

왜냐하면 제 언어에서는 자음이 이 순서로 나오기 때문입니다.

"k","kh",....,"ht",..."h",...,"a"

하지만 Python 3.x에서는 통과할 수 없을 것 같습니다.cmp키워드

>>> sorted(x,cmp=customsort)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'cmp' is an invalid keyword argument for this function

다른 대안이 있나요, 아니면 저만의 정렬된 함수도 작성해야 하나요?

참고: "k", "kh" 등을 사용하여 단순화했습니다.실제 문자는 유니코드이고 더 복잡하다, 자음 앞뒤에 모음이 올 때도 있고, 맞춤 비교 기능을 해봤기 때문에 그 부분은 괜찮습니다.문제는 사용자 지정 비교 기능을 sorted 또는 .sort에 전달할 수 없다는 것입니다.

사용key키워드 및 functools.cmp_to_key를 사용하여 비교 함수를 변환합니다.

sorted(x, key=functools.cmp_to_key(customsort))

사용key인수(그리고 이전의 것을 변환하는 방법에 대한 레시피를 따릅니다.cmp에 기능하는.key함수)를 선택합니다.

functools기능이 있습니다.cmp_to_keydocs.python.org/3.6/library/functools.html#functools.cmp_to_key 에서 언급됨

전체 python3 cmp_to_key 람다 예제:

from functools import cmp_to_key

nums = [28, 50, 17, 12, 121]
nums.sort(key=cmp_to_key(lambda x, y: 1 if str(x)+str(y) < str(y)+str(x) else -1))

일반 개체 정렬과 비교:

class NumStr:
    def __init__(self, v):
        self.v = v
    def __lt__(self, other):
        return self.v + other.v < other.v + self.v


A = [NumStr("12"), NumStr("121")]
A.sort()
print(A[0].v, A[1].v)

A = [obj.v for obj in A]
print(A)

커스텀 정렬() 대신 각 단어를 Python이 이미 정렬 방법을 알고 있는 것으로 변환하는 기능이 필요합니다.예를 들어, 각 단어를 각 숫자가 알파벳에서 각 문자가 발생하는 위치를 나타내는 숫자 목록으로 변환할 수 있습니다.이와 같은 것:

my_alphabet = ['a', 'b', 'c']

def custom_key(word):
   numbers = []
   for letter in word:
      numbers.append(my_alphabet.index(letter))
   return numbers

x=['cbaba', 'ababa', 'bbaa']
x.sort(key=custom_key)

언어에 다중 문자가 포함되어 있기 때문에 custom_key 함수는 분명히 더 복잡해야 합니다.하지만 그것은 당신에게 일반적인 생각을 줄 것입니다.

이것이 도움이 될지는 모르겠지만, 당신은 그것을 확인할 수 있습니다.locale모듈.로케일을 사용자 언어로 설정하고 사용할 수 있습니다.locale.strcoll언어의 정렬 규칙을 사용하여 문자열을 비교합니다.

사용key논쟁 대신에.처리 중인 값을 가져와서 정렬 기준으로 사용할 키를 제공하는 단일 값을 반환하는 함수를 사용합니다.

sorted(x, key=somekeyfunc)

언급URL : https://stackoverflow.com/questions/2531952/how-to-use-a-custom-comparison-function-in-python-3

반응형