programing

Python에서 람다로 정렬하는 방법

minecode 2022. 9. 22. 21:32
반응형

Python에서 람다로 정렬하는 방법

다음과 같이 속성별로 값을 정렬하려고 합니다.

a = sorted(a, lambda x: x.modified, reverse=True)

다음 오류 메시지가 나타납니다.

<lambda>() takes exactly 1 argument (2 given)

왜요? 어떻게 고치죠?


이 질문은 원래 Python 2.x용으로 작성되었습니다.3.x 에서는, 에러 메세지가 다릅니다.TypeError: sorted expected 1 argument, got 2.

사용하다

a = sorted(a, key=lambda x: x.modified, reverse=True)
#             ^^^^

Python 2.x에서는sorted함수는 다음 순서로 인수를 받습니다.

sorted(iterable, cmp=None, key=None, reverse=False)

그래서 이 없이key=, 전달된 함수는 다음과 같이 간주됩니다.cmp2개의 인수를 받는 함수입니다.

lst = [('candy','30','100'), ('apple','10','200'), ('baby','20','300')]
lst.sort(key=lambda x:x[1])
print(lst)

다음과 같이 인쇄됩니다.

[('apple', '10', '200'), ('baby', '20', '300'), ('candy', '30', '100')]

람다 함수와 함께 주요 함수를 사용하려고 합니다.

Python 및 C# 또는 F#과 같은 다른 언어들은 lambda 함수를 사용합니다.

또, 주요 기능에 대해서는, 또, 설명서에 따라서도,

list.sort()와 sorted() 모두 비교하기 전에 각 목록 요소에서 호출할 함수를 지정하는 키 파라미터가 있습니다.

...

key 매개 변수의 값은 단일 인수를 사용하고 정렬 목적으로 사용할 키를 반환하는 함수여야 합니다.키 함수는 각 입력 레코드에 대해 정확히 한 번 호출되므로 이 기술은 빠릅니다.

따라서 키 함수에는 파라미터 키가 있으며 실제로 람다 함수를 수신할 수 있습니다.

Real Python에는 사용 방법의 좋은 예가 있습니다.예를 들어 다음과 같은 리스트가 있다고 합시다.

ids = ['id1', 'id100', 'id2', 'id22', 'id3', 'id30']

그 '고유'를 정리하고 싶다.그러면 이렇게 하는 거예요.

sorted_ids = sorted(ids, key=lambda x: int(x[2:])) # Integer sort

그걸 인쇄하면

['id1', 'id2', 'id3', 'id22', 'id30', 'id100']

당신의 특별한 경우, 당신은 단지 쓸 것이 없습니다.key=람다보다 전에.따라서 다음을 사용하는 것이 좋습니다.

a = sorted(a, key=lambda x: x.modified, reverse=True)

Python3의 경우:

    from functools import cmp_to_key
    def compare(i1,i2):
      return i1-i2
    events.sort(key=cmp_to_key(compare))

이 예에서는 다음을 이해할 수 있습니다.

예 1:

a = input()
a = sorted(a, key = lambda x:(len(x),x))
print(a)

입력:["tim", "bob", "anna", "steve", "john","aaaa"]
출력:['bob', 'tim', 'aaaa', 'anna', 'john', 'steve']

입력:["tim", "bob", "anna", "steve", "john","aaaaa"]
출력:['bob', 'tim', 'anna', 'john', 'aaaaa', 'steve']


예 2(상세):

a = ["tim", "bob", "anna", "steve", "john","aaaaa","zzza"]
a = sorted(a, key = lambda x:(x[-1],len(x),x))
print(a)

출력:['anna', 'zzza', 'aaaaa', 'bob', 'steve', 'tim', 'john']


결론:

key = lambda x:(p1,p2,p3,p4,...,pn),
x는 입력 스트림에서 한 번에 하나의 요소입니다.
p1,p2,p3...pn요소의 흐름을 정렬해야 하는 기본 속성입니다.
우선순위에 따라p1>p2>p3>...>pn.
리버스도 추가 가능=True는 정렬 조건 후에 요소를 역순으로 정렬합니다.

Python3에서 lamda를 사용하여 정렬된 함수의 또 다른 훌륭한 예.

# list of sport teams with wins and losses
sportTeams = [("Royals", (18, 12)), ("Rockets", (24, 6)), 
                ("Cardinals", (20, 10)), ("Dragons", (22, 8)),
                ("Kings", (15, 15)), ("Chargers", (20, 10)), 
                ("Jets", (16, 14)), ("Warriors", (25, 5))]

# sort the teams by number of wins
sortedTeams = sorted(sportTeams, key=lambda t: t[1][0], reverse=True)
print(sortedTeams)

출력:

[('Warriors', (25, 5)), ('Rockets', (24, 6)), ('Dragons', (22, 8)), ('Cardinals', (20, 10)), ('Chargers', (20, 10)), ('Royals', (18, 12)), ('Jets', (16, 14)), ('Kings', (15, 15))]

언급URL : https://stackoverflow.com/questions/3766633/how-to-sort-with-lambda-in-python

반응형