2016-06-20 3 views
0

그래서 그래서 같은 값 목록이 있습니다키와 람다를 사용하여 파이썬 정렬, 람다는 무엇을합니까?

with open(file) as f: 
    data = json.load(f) 

values = data["values"] 

그때 분류하기 위해 노력하고있어 : 내가 지금과 같은 목록에 비단뱀 deafault JSON 파서에서 구문 분석하고 있습니다

{ 
    "values": 
    [ 
     { 
      "date": "2015-04-15T11:15:34", 
      "val": 30 
     }, 
     { 
      "val": 90, 
      "date": "2015-04-19T11:15:34" 
     }, 
     { 
      "val": 25, 
      "date": "2015-04-16T11:15:34" 
     } 
    ] 
} 

다음과 같은 날짜로 데이터 :

values.sort(key=lambda values: values["date"]) 

그리고 내 지식에 따라 작동합니다. 내 질문은 왜 작동합니까? 값 [ "날짜"]에 액세스 할 수없는 경우 왜이 람다 함수를 사용할 수 있습니까? 값은 "날짜"와 같은 키를 정수로 취할 수 없습니다. 이것이 의미하는 바는 값 [0], 값 [1] 등의 값만 액세스 할 수 있다는 것입니다. 사전이 아닌 목록이기 때문입니다. 따라서이 람다 함수가 다음과 같습니다.

def some_method(values): 
    return values[“date”] 

값이 사전이 아닌 목록이므로이 값은 유효하지 않습니다. 값 [ "날짜"]에 액세스 할 수 없습니다.

그럼 왜 이런 기능을 통해 날짜를 전달할 수 있습니까? 또한 람다를 깊이있게 설명하면 이해할 수있을 것입니다. 스택 오버플로에 대한 다른 게시물을 읽었지만 나에게 의미가 없습니다.

문제를보다 명확하게하기 위해 추가 정보가있는 질문이 업데이트되었습니다.

+0

생각하고 당신은 갈 수 있어요. –

답변

3

lambda 표현식은 단순히 함수를 작성하는 간결한 방법입니다. 특히 함수를 한 번만 사용해야하는 경우와 같이 표현식 (예 : 함수에 대한 인수)으로 사용해야하는 경우에 특히 유용합니다.

여기에 대신 lambda 표현의 def 문을 사용하여, 당신의 예제의 또 다른 버전입니다 : 두 줄 이상, 그리고 현재 네임 스페이스에 추가 변수 뒤에 잎

def keyfunc(values): 
    return values["date"] 
values.sort(key=keyfunc) 

. 람다 버전이 def 버전만큼 명확하면 일반적으로 더 나은 선택입니다.

기능상에 values이라는 추가 사용으로 인한 혼란이있을 수 있습니다. 그것은 단순히 잘못 선택된 인수 이름입니다. list.sort 메서드는 목록의 각 값에 대해 한 번만 key 함수를 호출하여 값을 첫 번째 위치 인수로 전달합니다. 이 값은 def 또는 lambda에 관계없이 함수 선언에 사용 된 변수 이름에 바인딩됩니다. 귀하의 예에서 더 나은 이름은 val 또는 item 일 수 있습니다. values 목록에서 하나의 항목 일 뿐이므로 이름은 실제로 원하는대로 될 수 있습니다. (실제로는 values이 잘 작동하고 혼란스럽게 보입니다.)

values.sort(key=lambda val: val["date"]) 

또는 :이 명확하게 될 것이다 묵시적 return 문으로 함수의 짧은 형태로 람다의

def keyfunc(val): 
    return val["date"] 
values.sort(key=keyfunc) 
+0

죄송합니다 연습 오타가 올바른 값을 정렬하는 변수입니다. 하지만 그게 문제 야. 코드를 통해 값 [ "날짜"]에 액세스 할 수 없지만이 람다 함수는 여전히 작동합니다. 왜? 마찬가지로, values는 사전이 아닌 목록입니다. – Minimi

+0

값이 목록을 참조하지 않고 새로운 함수의 인수이므로 해당 변수를 마스크합니다. 그것은'x' 또는'element' 또는 무엇이든 불릴 수 있습니다. –

+1

나는 '람다 (lambda)'와 일반 함수 (normal function)의 차이 이외에 혼란스러운 매개 변수 이름을 다루기위한 답을 업데이트했다. – Blckknght

관련 문제