난 그냥 이그나시오 바스케스 - 에이 브람스의 대답에 자세히 설명하겠습니다. cmp
은 더 이상 사용되지 않습니다. 사용하지 마십시오. 대신 key
속성을 사용하십시오.
lambda
이 기능을합니다. 이것은 표현식이므로 보통 def
문은 사용할 수 없지만 본문은 단일 표현식으로 제한됩니다.
my_func = lambda x: x + 1
이
는
x
를 하나의 인자를 가지고
x + 1
을 반환하는 함수를 정의합니다.
lambda x, y=1: x + y
은
x
인수를 취하는 함수를 정의합니다. 선택적인
y
인수는 기본값 1을 사용하고
x + y
을 반환합니다. 보시다시피 표현식이고 본문의 단일 표현식으로 제한된다는 점을 제외하면 실제로는
def
문과 같습니다.
key
특성의 목적은 정렬 할 시퀀스의 각 요소에 대해 sorted
을 호출하여 비교할 값을 사용한다는 것입니다.
list_ = ['a', 'b', 'c']
sorted(list_, key=lambda x: 1)
가설적인 예를 보려면 나머지를 읽으십시오. 이 글을 쓰기 전에 문제를 자세히 살펴 보지 않았습니다. 그것은 여전히 교육적 일 것이지만 나는 그것을 떠날 것이다.
우리는 정말 훨씬 더
- 때문에 당신이 할 수없는 종류의
dict
의 말할 수 없다. dicts
s의 목록이 있습니까? 우리는 그것을 분류 할 수 있습니다.
username
키가 표시되지 않았습니다.
나는 당신이 내가 톰 크루즈보다 더 굉장 해요 확인하고 싶었다면
users = [{'name': 'Tom Cruise', 'username': user234234234, 'reputation': 1},
{'name': 'Aaron Sterling', 'username': 'aaronasterling', 'reputation': 11725}]
같은 것이 있다고 가정합니다, 당신은 할 수 :
sorted(users, key=lambda x: x['reputation'])
이를 목록의 각 사전에 대해 'reputation'
값을 반환하는 함수를 전달합니다. 그러나 lambdas
은 더 느려질 수 있습니다. 대부분의 시간은 operator.itemgetter
입니다.
operator.itemgetter
은 일련의 키를 가져 와서 객체를 취하고 인수 값의 튜플을 반환하는 함수를 반환합니다.
그래서 f = operator.itemgetter('name', 'username')
는 차이가 원칙적으로 훨씬 더 빨리 실행해야하고 추한 lambda
표현에서 볼 필요가 없다는 것입니다 lambda d: (d['name'], d['username'])
으로 기본적으로 동일한 기능을 반환합니다.
그래서 이그나시오 바스케스 - 에이 브람스 제안 정확히 어떤 단지
sorted(list_of_dicts, operator.itemgetter('name', 'username'))
을 사용자 이름 다음 이름으로
dict
의 목록을 정렬합니다.
것은이 아닌 연산자와 같은 라이브러리를 가져올 수 내 클래스와 메신저에 대한 할당의 일부입니다. 그것의 유일한 builtin funcitons. 나는 네가 무엇을 얻고 있는지 이해하고 즉흥적으로 노력했다. 나는 "sorted (l, key = lambda l : (l [0], l [1]))"을 사용했는데 이것이 당신이 말한 것과 동일하다고 생각합니까? – 1337holiday
아닙니다. 'lambda x : (x [1], x [0])' –
이 함수는 이름을 정렬하지만 이름이 같으면 사용자 이름을 정렬하거나 동일한 위치를 유지합니까? 이름이 같으면 사용자 이름별로 정렬해야합니다. 고마워! – 1337holiday