Python max()不带关键字参数

时间:2014-03-04 14:47:19

标签: python python-2.4

我有一个脚本,我在运行Python 2.7.3的机器上编写,它利用带有键的max函数和glob来查找目录中特定类型的最年轻文件。我试图将它移动到另一台机器上,但发现它正在运行Python 2.4.3并且脚本不能正常工作。

问题出现在以下一行:

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

我查了一下文档,可以看到iglob和max都带有密钥,直到Python 2.5>

我可以将iglob引用更改为只是glob并摆脱不区分大小写的工作正常。但我不确定如何在不使用max和键的情况下重写上述内容?

3 个答案:

答案 0 :(得分: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 pointed outsorted函数 允许key参数,所以你也可以对你的清单进行排序并抓住最后一项:

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

答案 1 :(得分:6)

在Python 2.4.x中,sorted key;您可以将其应用于glob并取最后一项,例如:

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

答案 2 :(得分: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函数。 ......