[英]Python max() takes no keyword arguments
我有一個腳本,我在運行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和鍵的情況下重寫上述內容?
我不確定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]
在Python 2.4.x中, sorted
確實需要一個key
; 你可以將它應用於你的glob
並取最后一項,例如:
newest = sorted(glob.glob(bDir + '*.[Dd][Mm][Pp]'), key=os.path.getctime)[-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
函數,如果你需要在代碼中做很多事情並且不想把它放在每個位置......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.