programing

정렬된 구문 뒤에 있습니다(key=sortda: ...).

sourcetip 2022. 9. 12. 12:09
반응형

정렬된 구문 뒤에 있습니다(key=sortda: ...).

이면에 있는 구문을 잘 모르겠어요.sorted()인수:

key=lambda variable: variable[0]

아니다lambda제멋대로?왜?variable외관상으로는 두 번 진술하다dict?

이 답변은 모두 lambda 함수가 sorted()의 문맥에서 하는 일의 핵심을 잘 다루고 있다고 생각합니다만, 직감적으로 이해할 수 있는 설명은 아직 부족하다고 생각하기 때문에, 제 의견입니다.

완전성을 위해 먼저 명확하게 설명하겠습니다.sorted()는 정렬된 요소의 목록을 반환합니다.특정 방법으로 정렬하거나 복잡한 요소 목록(네스트된 목록이나 튜플 목록 등)을 정렬하려면 key 인수를 호출할 수 있습니다.

저는 키 인수에 대한 직관적인 이해, 왜 호출 가능해야 하는지, 그리고 이를 달성하기 위해 (익명의) 호출 가능 함수로 람다를 사용하는 것은 두 부분으로 나뉩니다.

  1. 최종적으로 lamba를 사용한다는 것은 sblom의 예시와 같이 함수 전체를 쓸 필요가 없다는 것을 의미합니다.Lambda 함수는 생성, 사용 및 즉시 파기되므로 한 번만 사용할 수 있는 더 많은 코드로 코드를 혼란시키지 않습니다.이것은 람다 함수의 핵심 효용이며 그러한 역할에 대한 적용 범위가 넓다.그 구문은 순전히 규약이며, 본질적으로는 일반적인 프로그램 구문의 성질입니다.구문을 익히고 끝내세요.

람다 구문은 다음과 같습니다.

lambda input_variable(s): tasty one liner

어디에lambda는 python 키워드입니다.

예.

In [1]: f00 = lambda x: x/2

In [2]: f00(10)
Out[2]: 5.0

In [3]: (lambda x: x/2)(10)
Out[3]: 5.0

In [4]: (lambda x, y: x / y)(10, 2)
Out[4]: 5.0

In [5]: (lambda: 'amazing lambda')() # func with no args!
Out[5]: 'amazing lambda'
  1. 이면에 있는 아이디어key인수란 기본적으로 정렬에 사용해야 하는 목록 요소에서 'filename()' 함수를 가리키는 일련의 명령을 사용해야 한다는 것입니다.라고 하면key=즉, 목록을 반복할 때 한 번에 한 가지 요소(즉,for e in some_listkey 인수로 지정된 함수에 현재 요소를 전달하고 이를 사용하여 최종 정렬된 목록의 순서를 알려주는 변환 목록을 만듭니다.

확인해 주세요.

In [6]: mylist = [3, 6, 3, 2, 4, 8, 23]  # an example list
# sorted(mylist, key=HowToSort)  # what we will be doing

기본 예:

# mylist = [3, 6, 3, 2, 4, 8, 23]
In [7]: sorted(mylist)
Out[7]: [2, 3, 3, 4, 6, 8, 23]  
# all numbers are in ascending order (i.e.from low to high).

예 1:

# mylist = [3, 6, 3, 2, 4, 8, 23]
In [8]: sorted(mylist, key=lambda x: x % 2 == 0)

# Quick Tip: The % operator returns the *remainder* of a division
# operation. So the key lambda function here is saying "return True 
# if x divided by 2 leaves a remainer of 0, else False". This is a 
# typical way to check if a number is even or odd.

Out[8]: [3, 3, 23, 6, 2, 4, 8]  
# Does this sorted result make intuitive sense to you?

내 람다 함수가 말해준 걸 봐sorted각 요소의 유무를 확인하다e짝수이거나 홀수일 경우 정렬합니다.

하지만 기다려!여러분은 두 가지 사항을 궁금해 할 수 있습니다.

첫째, 왜 홀수가 짝수 앞에 오는가?결국, 중요한 가치는 이 모든 것을 말해주는 것 같습니다.sorted를 사용하여 eves의 우선순위를 매기는 기능mod을 교환하다.x % 2 == 0.

둘째, 왜 짝수가 여전히 잘못된가?2는 6보다 앞에 오죠?

이 결과를 분석함으로써 특히 익명 람다 함수와 함께 'key' 인수가 실제로 어떻게 작동하는지 자세히 알아보겠습니다.

우선, 여러분은 확률이 저녁 식사보다 앞서지만, 저녁 식사 자체는 분류되지 않는다는 것을 알게 될 것입니다.왜 그럴까?다음 문서를 읽겠습니다.

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

여기서 행간을 조금 읽어야 하는데, 이것은 정렬 함수가 한 번만 호출된다는 것을 의미합니다. key 인수를 지정하면 키 함수가 가리키는 값에 따라 정렬됩니다.

모듈로를 사용한 예에서는 무엇을 반환합니까?부울값:True == 1,False == 0그러면 이 키는 어떻게 분류될까요?기본적으로 원본 목록을 1과 0의 순서로 변환합니다.

[3, 6, 3, 2, 4, 8, 23]된다[0, 1, 0, 1, 1, 1, 0]

이제 우리가 뭔가를 하네.변환된 목록을 정렬하면 무엇을 얻을 수 있습니까?

[0, 0, 0, 1, 1, 1, 1]

좋아, 이제 왜 승산이 더 많은지 알겠군하지만 다음 질문은 다음과 같습니다.최종 리스트에서 6이 2보다 앞서는 이유는 무엇입니까?그건 쉬워요. 왜냐하면 정렬은 한 번만 이루어지기 때문이에요!이러한 1은 여전히 서로 상대적인 원래 위치에 있는 원래 목록 값을 나타냅니다.정렬은 한 번만 이루어지며 원래 짝수를 낮은 값에서 높은 값으로 정렬하는 정렬 함수를 호출하지 않기 때문에 이러한 값은 서로 상대적인 원래 순서로 유지됩니다.

마지막 질문은 다음과 같습니다.최종 정렬 목록을 인쇄할 때 부울 값의 순서가 원래 값으로 다시 변환되는 방법에 대해 개념적으로 어떻게 생각하십니까?

Sorted()는 (재미있는 사실) Timsort라는 하이브리드 정렬 알고리즘을 사용하는 빌트인 메서드입니다.Timsort는 머지 정렬과 삽입 정렬의 측면을 조합한 것입니다.이 값을 메모리에 보관해 두고 람다 함수에 의해 결정된 부울 아이덴티티(마스크)를 번들 하는 메카닉이 있는 것은 분명합니다.순서는 람다 함수에서 계산된 부울 ID에 의해 결정되지만, 이러한 하위 목록(및 0)은 원래 값에 따라 정렬되지 않습니다.따라서 최종 리스트는 Ods와 Evens로 구성되지만 하위 리스트별로 정렬되지 않습니다(이 경우 even은 순서가 맞지 않습니다).승산이 정렬되어 있는 것은 원래 리스트의 우연에 의해 이미 정렬되어 있었기 때문입니다.여기서 중요한 점은 람다가 변환을 수행할 때 하위 목록의 원래 순서가 유지된다는 것입니다.

그러면 이 모든 것이 원래의 질문, 그리고 더 중요한 것은 어떻게 우리가 핵심 인수와 람다를 어떻게 구현해야 하는지에 대한 우리의 직관과 어떻게 관련되어 있을까요?

이 람다 함수는 람다 함수에 의해 변환된 부울에 값을 매핑하는 포인터인지, 또는 람다 함수에 의해 다시 결정되는 중첩된 목록의 특정 요소인지 등 우리가 정렬해야 하는 값을 가리키는 포인터라고 생각할 수 있습니다.

다음 코드를 실행하면 어떤 일이 일어날지 예측해 보겠습니다.

In [9]: mylist = [(3, 5, 8), (6, 2, 8), (2, 9, 4), (6, 8, 5)]
In[10]: sorted(mylist, key=lambda x: x[1])

나의sorted"이 목록을 정렬해 주세요"라고 분명히 말합니다.핵심 인수는 '각 요소에 대해'라고 말함으로써 이를 좀 더 구체적으로 만듭니다.xmylist, 해당 요소의 두 번째 인덱스를 반환하고 원본 목록의 모든 요소를 정렬합니다.mylist람다 함수에 의해 계산된 리스트의 정렬된 순서로 표시됩니다.튜플 목록이 있으므로 람다 함수를 사용하여 해당 튜플에서 인덱스된 요소를 반환할 수 있습니다.

정렬에 사용되는 포인터는 다음과 같습니다.

[5, 2, 9, 8] # the second element of each tuple

이 포인터 목록을 정렬하면 다음이 반환됩니다.

[2, 5, 8, 9]

이것을 에 적용하다mylist다음과 같은 것이 있습니다.

Out[10]: [(6, 2, 8), (3, 5, 8), (6, 8, 5), (2, 9, 4)]
# Notice the sorted pointer list is the same as the second index of each tuple in this final list

코드를 실행하면 이게 명령이라는 걸 알 수 있을 거예요이 키 함수를 사용하여 정수 목록을 정렬해 보면 코드가 깨진다는 것을 알 수 있습니다(왜?).정수를 인덱싱할 수 없기 때문입니다).

장황한 설명이었습니다만, 이것이 도움이 되었으면 합니다.sort사용에 대한 당신의 직관lambdafunctions - sorted 및 그 이후의 주요 인수로서 기능합니다.

key컬렉션 항목을 비교하기 전에 변환하기 위해 호출되는 함수입니다.매개 변수가 전달되었습니다.key호출 가능한 것이어야 합니다.

의 사용lambda는, 어나니머스 함수(콜 가능)를 작성합니다.의 경우sorted콜 가능한 파라미터는 1개뿐입니다.파이썬의lambda꽤 간단합니다.정말 한 가지만 하고 돌려줄 수 있어요.

의 구문lambda명령이다lambda파라미터 이름 목록 뒤에 코드 블록이 표시됩니다.파라미터 목록과 코드 블록은 콜론으로 표시됩니다.이것은 python 및 다음과 같은 python의 다른 구성 요소와 유사합니다.while,for,if기타 등등.모두 일반적으로 코드 블록이 있는 문입니다.Lambda는 코드 블록이 있는 문장의 또 다른 예입니다.

람다의 사용과 def의 사용을 비교하여 함수를 만들 수 있습니다.

adder_lambda = lambda parameter1,parameter2: parameter1+parameter2
def adder_regular(parameter1, parameter2): return parameter1+parameter2

람다는 이름을 붙이지 않고 이 일을 할 수 있는 방법을 알려줘요따라서 함수에 대한 매개 변수로 사용할 수 있습니다.

variable콜론의 왼쪽은 파라미터의 이름이고 오른쪽은 코드 블록에서 무언가를 계산하기 위해 사용되고 있기 때문에 여기서 두 번 사용됩니다.

lambda는 익명 함수를 생성하기 위해 사용되는 Python 키워드입니다.

>>> (lambda x: x+2)(3)
5

variable왼쪽:는 파라미터 이름입니다.의 사용variable오른쪽은 파라미터를 사용하고 있습니다.

의미는 다음과 거의 동일합니다.

def some_method(variable):
  return variable[0]

key=sortda를 사용하는 sorted() 함수의 또 다른 예입니다.튜플 리스트가 있다고 칩시다.각 튜플에는 자동차의 브랜드, 모델 및 중량이 있으며 이 튜플 목록을 브랜드, 모델 또는 중량별로 정렬하려고 합니다.람다로 할 수 있어요.

cars = [('citroen', 'xsara', 1100), ('lincoln', 'navigator', 2000), ('bmw', 'x5', 1700)]

print(sorted(cars, key=lambda car: car[0]))
print(sorted(cars, key=lambda car: car[1]))
print(sorted(cars, key=lambda car: car[2]))

결과:

[('bmw', 'x5', '1700'), ('citroen', 'xsara', 1100), ('lincoln', 'navigator', 2000)]
[('lincoln', 'navigator', 2000), ('bmw', 'x5', '1700'), ('citroen', 'xsara', 1100)]
[('citroen', 'xsara', 1100), ('bmw', 'x5', 1700), ('lincoln', 'navigator', 2000)]

lambda는 임의 함수가 아닌 익명 함수입니다.허용되는 매개 변수는 작업 중인 변수와 해당 매개 변수를 정렬하는 열입니다.

간단한 답변과 함께 질문에 대한 예를 제시합니다.다음 예를 따릅니다.

 user = [{"name": "Dough", "age": 55}, 
            {"name": "Ben", "age": 44}, 
            {"name": "Citrus", "age": 33},
            {"name": "Abdullah", "age":22},
            ]
    print(sorted(user, key=lambda el: el["name"]))
    print(sorted(user, key= lambda y: y["age"]))

리스트의 이름을 보세요.D, B, C, A로 시작합니다.그리고 나이를 보시면 55세, 44세, 33세, 22세입니다.첫 번째 인쇄 코드

print(sorted(user, key=lambda el: el["name"]))

결과:

[{'name': 'Abdullah', 'age': 22}, 
{'name': 'Ben', 'age': 44}, 
{'name': 'Citrus', 'age': 33}, 
{'name': 'Dough', 'age': 55}]

key=snamda el: el["name"]을 사용하여 이름을 정렬하고 이름을 알파벳 순으로 반환하기 때문입니다.

두 번째 인쇄 코드

print(sorted(user, key= lambda y: y["age"]))

결과:

[{'name': 'Abdullah', 'age': 22},
 {'name': 'Citrus', 'age': 33},
 {'name': 'Ben', 'age': 44}, 
 {'name': 'Dough', 'age': 55}]

연령별로 정렬되므로 목록은 나이 오름차순으로 반환됩니다.

이 코드를 사용하여 더 잘 이해하십시오.

의 다른 사용법lambda그리고.sorted는 다음과 같습니다.

입력 배열 지정:people = [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]

행:people_sort = sorted(people, key = lambda x: (-x[0], x[1]))할 것이다people_sort로 기재하다.[[7,0],[7,1],[6,1],[5,0],[5,2],[4,4]]

이 경우,key=lambda x: (-x[0], x[1])기본적으로는sorted먼저 각 인스턴스의 첫 번째 요소 값을 기준으로 배열을 정렬하고(마이너스 부호가 시사하는 대로 내림차순으로), 그 다음 동일한 하위 그룹 에서 각 인스턴스의 두 번째 요소를 기준으로 정렬합니다(기본 옵션인 오름차순으로 정렬).

이것이 당신에게 유용한 정보가 되길 바랍니다!

람다의 사용이 다음 문맥에서 질문되었기 때문에sorted()https://wiki.python.org/moin/HowTo/Sorting/ #Key_Functions도 참조해 주세요.

바꿔 말하면, 키(옵션)입니다.순서를 결정하기 위해 실행할 함수입니다.정렬된 함수의 기본값은 없음)입니다. 함수를 기대하며 람다를 사용합니다.

lamda를 정의하려면 정렬할 객체 속성을 지정하면 python의 내장된 정렬 함수가 자동으로 처리됩니다.

여러 속성을 기준으로 정렬하려면 키 = lambda x:(11, property2)를 할당합니다.

순서별을 지정하려면 reverse= true를 세 번째 인수로 전달합니다(선택 사항).부울.False는 오름차순으로 정렬되고 True는 내림차순으로 정렬됩니다.정렬된 함수의 기본값은 False)입니다.

언급URL : https://stackoverflow.com/questions/8966538/syntax-behind-sortedkey-lambda

반응형