2014-03-04 77 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函數...