【问题标题】:Python sort using key and lambda, what does lambda do?Python使用key和lambda排序,lambda是做什么的?
【发布时间】:2016-06-20 03:49:58
【问题描述】:

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

{
    "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 默认 json 解析器将其解析为如下列表:

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

values = data["values"]

然后我尝试按日期对数据进行排序,如下所示:

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

这很有效(据我所知)。我的问题是它为什么有效?如果我不能访问 values["date"] 那么为什么我可以使用这个 lambda 函数呢? values 不能像“date”这样的键只取一个整数。我的意思是我只能访问这样的值:values[0]、values[1] 等......因为它是一个列表而不是字典。所以如果这个 lambda 函数等效是这样的:

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

那么这是无效的,因为 values 是一个列表而不是字典。我无法访问值["date"]。

那么为什么我可以像这样通过函数传递日期呢?另外,如果您能深入解释 lambda,那将不胜感激。我已经阅读了有关堆栈溢出的其他帖子,但它们对我来说没有意义。

用更多信息更新问题,使问题更清晰。

【问题讨论】:

  • 将 lambda 视为具有隐含 return 语句的函数的简短形式,您就可以开始了。

标签: python lambda


【解决方案1】:

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)

【讨论】:

  • 抱歉,练习是一个错字,要排序的正确变量是值。但就是这样。我无法通过代码访问 values["date"] 但这个 lambda 函数仍然有效。为什么?如,值是一个列表而不是字典。
  • Values 不是指您的列表,它是新函数的参数,因此它将掩盖该变量。它可以称为xelement 或其他任何名称。
  • 除了lambda 和普通函数之间的区别之外,我已经更新了答案以解决令人困惑的参数名称。
  • 哦,我明白了,实际情况是,'val' 是列表 'values' 中的元素之一(这是我可以使用 val["date"] 或 val 访问的字典["val"]。我理解正确吗?
  • OHHH 我明白了,非常感谢。比 TigerhawkT3 更有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-17
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多