【问题标题】:Default key for Python builtin max/min functionsPython 内置最大/最小函数的默认键
【发布时间】:2011-12-05 01:43:40
【问题描述】:

Python 中内置函数max 和min 的文档表明key 参数应该像在sort 函数中一样运行。换句话说,我应该能够做到这一点:

a = [1, 2, 3, 4]
max(a, key=None)

但是,这会引发错误: TypeError: 'NoneType' object is not callable

但是,如果我对 sort 函数做类似的事情,我会得到预期的结果:

a = [1, 2, 3, 4]
a.sort(key=None)

不会产生错误并使用默认排序。几本书还暗示我应该能够摆脱max 和min 函数中的相同行为。请参阅Python in a Nutshell 的这段摘录。

这真的是max 和min 函数的默认行为吗?应该是吗?他们不应该匹配排序功能吗?

【问题讨论】:

    标签: python


    【解决方案1】:

    @David 的回答很完美。如果您想知道,只需添加默认的key 值(在sort 和max/min 函数中)类似于:

    lambda x: x
    

    【讨论】:

    • 但是,sort 处理传递 None 作为默认值,而 min/max 没有。所以,有些东西正在以不同的方式实施。如果您查看代码, min 和 max 函数只需检查参数字典中是否已定义。我不相信 max/min 键参数有默认值,只是默认行为。
    【解决方案2】:

    您偶然发现了.sort 和max 的实现差异,而不仅仅是语言的问题。

    list.sort() 采用关键字参数“key”,它恰好默认为 None。这意味着 sort 方法无法区分您提供 key=None 参数还是仅采用默认值。无论哪种情况,它的行为都好像没有提供任何键功能。

    max 另一方面是检查关键字参数“key”的存在。它没有默认值,如果存在,它的值将用作键功能。

    无论哪种方式,key 都不应该作为 None 提供。它应该是一个用于从列表/可迭代项中提取“键”值的函数。例如:

    a = [("one", 1), ("two", 2), ("three", 3), ("four", 4)]
    a.sort(key=lambda item:item[1])
    

    【讨论】:

    • 感谢您的回复。我知道这些功能的实际实现是不同的,但我有点沮丧,因为我能找到的所有文档都没有明确说明这种差异。
    • 没问题。如果这回答了你的问题,接受它总是值得的。
    猜你喜欢
    • 2020-10-17
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多