2014-03-04 49 views
4

我有一个脚本,我在一台运行Python 2.7.3的机器上编写,利用带密钥的max函数以及glob来查找目录中特定类型的最新文件。我试图将它移动到另一台机器上,以发现它运行的是Python 2.4.3,因此脚本不起作用。Python max()不带关键字参数

问题与以下行出现了:

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

我抬起头来的文件,并且可以看到,无论是iglob和最大用钥匙才能提供的Python 2.5>

我可以将iglob引用更改为只是glob,并摆脱不起作用的不区分大小写。但我不知道如何在不使用max的情况下重写上述内容?

+11

安装不是十的Python版本岁吗? –

+0

这是一个生产服务器,我不允许更改运行在其上的Python版本。否则,我会这样做,而不是问这个问题。我也不允许同时使用另一个版本的Python。 – opmon5

回答

7

我不确定Python 2.4有哪些工具可以访问,但我敢肯定你仍然有列表解析功能,所以你可以将你的列表与你想要使用的关键字一起列表,比较,然后解压缩。这是有效的,因为元组比较元素明智,所以如果你把“key”放在元组前面,它将作为主要比较器。

# 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] 
+0

这工作完美,感谢您的及时响应。 – opmon5

6

在Python 2.4.x的,sorted确实采取key;你可以将此您glob,并采取最后一个项目,例如:

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

这也很完美,谢谢 – opmon5

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函数...