Python sort with key y lambda, ¿qué hace lambda?

Así que tengo una lista de valores así:

{ "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" } ] } 

que estoy analizando con pythons deafault json parser en una lista como esta:

 with open(file) as f: data = json.load(f) values = data["values"] 

Entonces estoy tratando de ordenar los datos por fecha de esta manera:

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

Y esto funciona (que yo sepa). Mi pregunta es ¿por qué funciona? Si no puedo acceder a los valores [“fecha”], ¿por qué puedo usar esta función lambda? los valores no pueden tomar una clave como “fecha” solo un número entero. Lo que quiero decir con esto es que solo puedo acceder a valores así: valores [0], valores [1], etc … porque es una lista, no un diccionario. Así que si esta lambda funciona de manera equivalente es esto:

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

entonces esto no es válido porque los valores son una lista, no un diccionario. No puedo acceder a los valores [“fecha”].

Entonces, ¿por qué puedo pasar la fecha a través de la función como esta? También si pudieras explicar lambda en profundidad eso sería apreciado. He leído otras publicaciones en la stack desbordante al respecto, pero simplemente no tienen sentido para mí.

Pregunta actualizada con más información para aclarar el problema.

Una expresión lambda es simplemente una forma concisa de escribir una función. Es especialmente útil en casos como el que da donde solo necesita usar la función una vez, y debe usarse como una expresión (por ejemplo, un argumento para una función).

Aquí hay una versión alternativa de su ejemplo, usando la instrucción def lugar de una expresión lambda :

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

Eso es dos líneas más, y deja una variable adicional en el espacio de nombres actual. Si la versión lambda es tan clara como la versión def , generalmente es una mejor opción.

Parece que su confusión puede provenir del uso adicional de los values nombre en la función. Eso es simplemente un nombre de argumento mal elegido. El método list.sort llamará a la función key una vez para cada valor en la lista, pasando el valor como el primer argumento posicional. Ese valor se vinculará a cualquier nombre de variable que se utilice en la statement de función (independientemente de si se trata de una def o un lambda ). En su ejemplo, un nombre mejor podría ser val o item , ya que será solo un ítem de la lista de values . El nombre realmente podría ser lo que quieras (y, de hecho, los values funcionan bien, solo parece confuso). Esto sería más claro:

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

O:

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