所以我有一个像这样的值列表:
{
"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"
}
]
}
我正在使用pythons deafault json解析器解析为这样的列表:
with open(file) as f:
data = json.load(f)
values = data["values"]
然后尝试按日期对数据进行排序:
values.sort(key=lambda values: values["date"])
这是有效的(据我所知)。我的问题是它为什么有效?如果我无法访问值[" date"]那么为什么我可以使用这个lambda函数?价值观不能像" date"只是一个整数。我的意思是我只能访问像这样的值:values [0],values [1]等...因为它不是字典而是列表。所以,如果这个lambda函数等价于:
def some_method(values):
return values[“date”]
然后这是无效的,因为值是列表而不是字典。我无法访问值[" date"]。
那么为什么我可以像这样通过函数传递日期?此外,如果你能解释lambda的深度,将不胜感激。我已经阅读了有关它的堆栈溢出的其他帖子,但它们对我没有意义。
更新了问题以及更多信息,以使问题更加清晰。
答案 0 :(得分:4)
lambda
表达式只是编写函数的简洁方法。它在你只需要使用一次函数的情况下特别方便,它需要用作表达式(例如函数的参数)。
以下是您的示例的替代版本,使用def
语句而不是lambda
表达式:
def keyfunc(values):
return values["date"]
values.sort(key=keyfunc)
这两行更长,并在当前命名空间中留下了一个额外的变量。如果lambda版本与def
版本一样清晰,那么它通常是更好的选择。
看起来您的混淆可能来自在函数中额外使用名称values
。这只是一个选择不当的参数名称。 list.sort
方法将为列表中的每个值调用key
函数一次,将值作为第一个位置参数传递。该值将绑定到函数声明中使用的任何变量名称(无论它是def
还是lambda
)。在您的示例中,更好的名称可能是val
或item
,因为它只是values
列表中的单个项目。这个名字可能真的是你想要的(事实上,values
工作正常,它看起来很混乱)。这会更清楚:
values.sort(key=lambda val: val["date"])
或者:
def keyfunc(val):
return val["date"]
values.sort(key=keyfunc)