簡體   English   中英

Python max()不帶關鍵字參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM