使用key和lambda进行Python排序,lambda做了什么?

时间:2016-06-20 03:49:58

标签: python lambda

所以我有一个像这样的值列表:

{
    "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的深度,将不胜感激。我已经阅读了有关它的堆栈溢出的其他帖子,但它们对我没有意义。

更新了问题以及更多信息,以使问题更加清晰。

1 个答案:

答案 0 :(得分:4)

lambda表达式只是编写函数的简洁方法。它在你只需要使用一次函数的情况下特别方便,它需要用作表达式(例如函数的参数)。

以下是您的示例的替代版本,使用def语句而不是lambda表达式:

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

这两行更长,并在当前命名空间中留下了一个额外的变量。如果lambda版本与def版本一样清晰,那么它通常是更好的选择。

看起来您的混淆可能来自在函数中额外使用名称values。这只是一个选择不当的参数名称。 list.sort方法将为列表中的每个值调用key函数一次,将值作为第一个位置参数传递。该值将绑定到函数声明中使用的任何变量名称(无论它是def还是lambda)。在您的示例中,更好的名称可能是valitem,因为它只是values列表中的单个项目。这个名字可能真的是你想要的(事实上,values工作正常,它看起来很混乱)。这会更清楚:

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

或者:

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