[python] ‘key’및 람다 식을 사용하는 python max 함수

나는 OOP 배경에서 왔으며 파이썬을 배우려고합니다. I가 사용하고 max타입의 인스턴스 반환 람다 식을 사용하는 기능을 Player갖는 최대 totalScore리스트 중에서이 players.

def winner():
    w = max(players, key=lambda p: p.totalScore)

이 함수 Player는 maximum 유형의 인스턴스를 올바르게 반환합니다 totalScore. 다음 세 가지에 대해 혼란스러워합니다.

  1. max기능 은 어떻게 작동합니까? 그것이 취하는 주장은 무엇입니까? 설명서를 보았지만 이해하지 못했습니다.
  2. keymax 함수 에서 키워드 사용이란 무엇입니까 ? 나는 그것이 sort기능의 맥락에서 사용된다는 것을 안다.
  3. 람다 표현의 의미? 읽는 법? 그들은 어떻게 작동합니까?

이것들은 모두 매우 개념적인 질문이지만 언어를 이해하는 데 도움이 될 것입니다. 설명 할 예제를 줄 수 있다면 도움이 될 것입니다. 감사



답변

lambda 익명 함수이며 다음과 같습니다.

def func(p):
   return p.totalScore     

이제 max이된다 :

max(players, key=func)

그러나 def명령문은 복합 명령문이므로 표현식이 필요한 곳에서는 사용할 수 없으므로 때때로 lambda의문이 사용됩니다.

lambda당신이의 return 문에 넣어했던 것과 동일합니다 def. 따라서 내부에서 문을 사용할 수 없으며 lambda표현식 만 허용됩니다.


무엇을 max합니까?

최대 (a, b, c, … [, key = func])-> 값

반복 가능한 단일 인수로 가장 큰 항목을 반환하십시오. 두 개 이상의 인수를 사용하면 가장 큰 인수를 반환하십시오.

따라서 가장 큰 객체를 반환합니다.


어떻게 key작동합니까?

기본적으로 Python 2 key에서는 객체 유형에 따라 규칙 집합을 기준으로 항목을 비교 합니다 (예 : 문자열이 항상 정수보다 큼).

비교하기 전에 객체를 수정하거나 특정 속성 / 인덱스를 기준으로 비교하려면 key인수 를 사용해야합니다 .

예 1 :

간단한 예를 들어, 문자열 형식의 숫자 목록이 있지만 해당 항목을 정수 값으로 비교하려고한다고 가정하십시오.

>>> lis = ['1', '100', '111', '2']

다음 max은 원래 값을 사용하여 항목을 비교합니다 (문자열은 사전 식으로 비교되므로 '2'출력으로 표시됨).

>>> max(lis)
'2'

정수 값으로 항목을 비교하려면 key간단한 lambda다음을 사용하십시오 .

>>> max(lis, key=lambda x:int(x))  # compare `int` version of each item
'111'

예 2 : max튜플 목록에 적용

>>> lis = [(1,'a'), (3,'c'), (4,'e'), (-1,'z')]

기본적으로 max첫 번째 색인으로 항목을 비교합니다. 첫 번째 인덱스가 같으면 두 번째 인덱스를 비교합니다. 내 예에서와 같이 모든 항목에는 고유 한 첫 번째 색인이 있으므로 이것을 답으로 얻을 수 있습니다.

>>> max(lis)
(4, 'e')

그러나 각 항목을 인덱스 1의 값으로 비교하려면 어떻게해야합니까? 단순 : 사용 lambda:

>>> max(lis, key = lambda x: x[1])
(-1, 'z')

iterable에서 다른 유형의 객체를 포함하는 항목 비교 :

혼합 항목 목록 :

lis = ['1','100','111','2', 2, 2.57]

Python 2에서는 두 가지 유형의 항목을 비교할 수 있습니다 .

>>> max(lis)  # works in Python 2
'2'
>>> max(lis, key=lambda x: int(x))  # compare integer version of each item
'111'

그러나 파이썬 3에서는 더 이상 그렇게 할 수 없습니다 :

>>> lis = ['1', '100', '111', '2', 2, 2.57]
>>> max(lis)
Traceback (most recent call last):
  File "<ipython-input-2-0ce0a02693e4>", line 1, in <module>
    max(lis)
TypeError: unorderable types: int() > str()

그러나 각 객체의 정수 버전을 비교할 때 작동합니다.

>>> max(lis, key=lambda x: int(x))  # or simply `max(lis, key=int)`
'111'


답변

의 단순화 된 버전 max:

def max(items, key=lambda x: x):
    current = item[0]
    for item in items:
        if key(item) > key(current):
            current = item
    return current

람다에 관하여 :

>>> ident = lambda x: x
>>> ident(3)
3
>>> ident(5)
5

>>> times_two = lambda x: 2*x
>>> times_two(2)
4


답변

최대 기능은 어떻게 작동합니까?

iterable에서 “가장 큰”항목을 찾습니다. 나는 그것이 무엇인지 찾아 볼 수 있다고 가정하지만 그렇지 않은 경우 목록이나 문자열과 같이 반복 할 수있는 것입니다.

max 함수에서 키워드 키를 사용하는 것은 무엇입니까? 정렬 기능과 관련하여도 사용됩니다.

Keymaxiterable의 어떤 객체가 다른 객체보다 큰지를 알려주는 람다 함수입니다 . 자신이 만든 객체를 정렬하고 정수와 같이 명백한 것이 아니라고 가정하십시오.

람다 표현의 의미? 읽는 법? 그들은 어떻게 작동합니까?

그것은 더 큰 질문입니다. 간단히 말해서 람다는 전달할 수있는 함수 이며 다른 코드 조각에서이를 사용할 수 있습니다. 예를 들면 다음과 같습니다.

def sum(a, b, f):
    return (f(a) + f(b))

이 두 객체를 소요 a하고 b, 그리고 기능 f. f()각 객체를 호출 한 다음 함께 추가합니다. 따라서이 전화를보십시오 :

>>> sum(2, 2, lambda a:  a * 2)
8

sum()을 취하고 2람다 식을 호출합니다. 그래서 f(a)되고 2 * 2그런 다음이 작업을 수행 4.이되는, b그리고이 함께 추가됩니다.

그렇게 간단한 용어는 아니지만 람다는 함수를 반환하는 함수의 아이디어 인 람다 미적분학에서 나온 것입니다. 계산 표현을위한 매우 멋진 수학 개념. 여기 에서 그것에 대해 읽고 실제로 여기 에서 이해할있습니다 .

람다는 혼란 스러울 수 있으므로 이것에 대해 조금 더 읽는 것이 좋으며, 그것이 얼마나 유용한 지 즉시 알 수는 없습니다. 여기를 확인 하십시오 .


답변

max함수는의 최대 값을 얻는 데 사용됩니다 iterable.

반복자는 목록, 튜플, dict 객체 등일 수 있습니다. 또는 제공 한 예제에서와 같이 사용자 정의 객체 일 수도 있습니다.

max(iterable[, key=func]) -> value
max(a, b, c, ...[, key=func]) -> value

With a single iterable argument, return its largest item.
With two or more arguments, return the largest argument.

따라서 key=func기본적으로 key주어진 반복자 / 인수가 정렬되고 최대 값이 반환되는 함수를 기준으로 선택적 인수를 전달할 수 있습니다 .

lambda의사 함수의 역할을하는 python 키워드입니다. 따라서 player객체를 전달 하면을 반환 player.totalScore합니다. 따라서 함수에 전달 된 iterable은 주어진 객체 maxkey totalScore 에 따라 정렬되며 최대를 가진 사람을 player반환합니다 .playertotalScore

key인수가 제공 되지 않으면 기본 Python 순서에 따라 최대 값이 리턴됩니다.

예-

max(1, 3, 5, 7)
>>>7
max([1, 3, 5, 7])
>>>7

people = [('Barack', 'Obama'), ('Oprah', 'Winfrey'), ('Mahatma', 'Gandhi')]
max(people, key=lambda x: x[1])
>>>('Oprah', 'Winfrey')


답변

설명서 에 따르면 :

max (iterable [, key])
max (arg1, arg2, * args [, key])
iterable 또는 2 개 이상의 인수 중 가장 큰 항목을 리턴합니다.

하나의 위치 인수가 제공되면 iterable은 비어 있지 않은 iterable이어야합니다 (예 : 비어 있지 않은 문자열, 튜플 또는 목록). iterable에서 가장 큰 항목이 반환됩니다. 둘 이상의 위치 인수가 제공되면 가장 큰 위치 인수가 리턴됩니다.

선택적 키 인수는 list.sort ()에 사용되는 것과 같은 하나의 인수 순서 함수를 지정합니다. 키 인수가 제공되는 경우 키워드 형식이어야합니다 (예 : max (a, b, c, key = func)).

이것이 말하는 것은 귀하의 경우,이 경우 목록을 제공한다는 것 players입니다. 그런 다음이 max함수는 목록의 모든 항목을 반복하고 서로 비교하여 “최대 값”을 얻습니다.

당신이 상상할 수 있듯이, player비교를위한 값을 결정하는 것과 같은 복잡한 객체를 사용하는 것은 까다롭기 때문에 함수가 각각의 값 key을 결정하는 방법을 결정하는 인수 가 제공 max됩니다 player. 이 경우 “각 말할 수있는 람다 함수 사용 pplayersGET p.totalscore그 비교를 위해 자신의 값으로 사용을”.


답변

max첫 번째 인수 iterable(목록 또는 튜플과 같은) 를 취하는 함수가 내장되어 있습니다.

키워드 인수 key에는 기본값이 None있지만 평가할 함수를 받아들이고 함수를 기반으로 반복 가능하게 평가하는 래퍼로 간주하십시오.

이 예제 사전을 고려하십시오.

d = {'aim':99, 'aid': 45, 'axe': 59, 'big': 9, 'short': 995, 'sin':12, 'sword':1, 'friend':1000, 'artwork':23}

전의:

>>> max(d.keys())
'sword'

kwarg (함수 key) 없이 iterable 만 전달하면 알 수 있듯이 키의 최대 값을 (알파벳순으로) 반환합니다

전의. 알파벳 순으로 키의 최대 값을 찾는 대신 키 길이로 최대 키를 찾아야 할 수도 있습니다.

>>>max(d.keys(), key=lambda x: len(x))
'artwork'

이 예제에서 람다 함수는 반복되는 키의 길이를 반환하므로 알파벳순으로 고려하는 대신 값을 평가하는 동안 키의 최대 길이를 추적하고 최대 길이의 키를 반환합니다

전의.

>>> max(d.keys(), key=lambda x: d[x])
'friend'

이 예제에서 람다 함수는 최대 값을 갖는 해당 사전 키의 값을 반환합니다.


답변