IT TIP

Python 3에서 사용자 지정 비교 함수를 사용하는 방법은 무엇입니까?

itqueen 2020. 10. 14. 21:33
반응형

Python 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']

에 있기 때문에 언어, consonents은이 순서와 함께 제공

"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인수를 사용하고 이전 함수를 함수 로 변환하는 방법에 대한 레시피따르십시오 .cmpkey

functoolsdocs.python.org/3.6/library/functools.html#functools.cmp_to_key에cmp_to_key 언급 된 함수가 있습니다.


key키워드와 functools.cmp_to_key사용 하여 비교 함수를 변환하십시오.

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

customsort () 대신 각 단어를 파이썬이 이미 정렬하는 방법을 알고있는 것으로 번역하는 함수가 필요합니다. 예를 들어 각 단어를 숫자 목록으로 번역 할 수 있습니다. 여기서 각 숫자는 알파벳에서 각 문자가 나오는 위치를 나타냅니다. 이 같은:

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하는 언어의 정렬 규칙을 사용하여 문자열을 비교 하는 사용할 수있는 것 같습니다 .


완전한 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 = ["12", "121"]
A.sort()

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

sorted(x, key=somekeyfunc)

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

반응형