Python max()不接受关键字参数

4 投票
3 回答
1270 浏览
提问于 2025-04-17 20:47

我写了一个脚本,运行在Python 2.7.3的机器上,这个脚本用到了max函数和key参数,还用到了glob模块,目的是在一个文件夹里找到最新的某种类型的文件。后来我想把这个脚本搬到另一台机器上,却发现那台机器上运行的是Python 2.4.3,所以脚本不能正常工作。

问题出在这一行代码:

newest = max(glob.iglob(bDir + '*.[Dd][Mm][Pp]'), key=os.path.getctime)

我查了一下文档,发现iglob和带key的max函数在Python 2.5及以上版本才有。

我可以把iglob改成glob,这样就去掉了不区分大小写的功能,这样是可以正常工作的。但是我不太确定怎么在不使用带key的max的情况下重写上面的代码。

3 个回答

1

你可以自己写一个,使用经典的DSU方法:

try:
    # At least give it a chance, in case a modern version of Python is running,
    # it would be faster
    my_max = max(my_list, key=my_func)
except:
    my_decorated = [(my_func(x), x) for x in my_list]
    my_max = max(my_decorated)[1]

如果你在代码中经常需要这样做,甚至可以在最上面写一个,覆盖掉内置的 max 函数,这样就不用在每个地方都写了……

6

在Python 2.4.x版本中,sorted 确实可以使用一个 key 参数;你可以把这个应用到你的 glob 上,然后取最后一个项目,比如:

newest = sorted(glob.glob(bDir + '*.[Dd][Mm][Pp]'), key=os.path.getctime)[-1]
7

我不太确定Python 2.4能用哪些工具,但我知道你应该还是可以用列表推导式。你可以把列表和你想用的关键字组合成一个元组,然后进行比较,最后再拆开。这种方法有效是因为元组是逐个元素比较的,所以如果把“关键字”放在元组的最前面,它就会作为主要的比较依据。

# Note: untested
times_files = [(os.path.getctime(f),f) for f in glob.glob(bDir+'*.[Dd][Mm][Pp]')]
newest = max(timed_files)[1] # grab the filename back out of the "max" tuple

另外(如果速度对你的情况很重要,这种方法可能更快),正如@jonrsharpe提到的sorted函数确实允许你传入一个key参数,所以你也可以对列表进行排序,然后取最后一个项目:

newest = sorted(glob.glob(bDir + '*.[Dd][Mm][Pp]'), key=os.path.getctime)[-1]

撰写回答