2012-12-27 31 views
-1

我有一個通過FTP連接到網站的Python腳本,並列出了網站上的程序的當前版本號。我創建了一個數組來保存版本號,直到腳本從數組中選出最大數字並告訴我它是什麼。例如我的陣列通常會是這樣的:Python - 返回數組中的最大數。錯誤

array = ['1.04','1.6','1.14'] 

所以我用...

max_in_array = max(array) 

到陣列中返回的最大值。

不幸的是,當「1.14」是最新的版本號時,我收到的是最大的「1.6」。 我唯一能想到的其他事情就是切斷'1'。從陣列的列表,以便我收到:

array = ['04','6','14'] 

然後重新粘貼它以獲取完整版本號。但由於這個網站包含許多版本,如'2.02.04'和'1.14.01',我不知道如何有效地做到這一點。

任何幫助將不勝感激!


os.chdir("./gnu/"+_package) 

pope = len(_package) + 1 ## Cuts off name of program 
char = len(_package) - 12 ## Cuts off extension ".tar.gz" 

for tok in glob.glob("*.tar.gz"): 
    token.append(tok) ## Appends name to array 
    bork = max(token) ## Gets max version number (sometimes useless) 
    print bork 
    char = len(bork) - 7 

for _gnu in glob.glob("*.tar.gz"): ## Finds only matches with .tar.gz 
    _gnuapp.append(_gnu[pope:char]) ## Appends version number to array 
    spoke = max(_gnuapp) ## Gets max version number 
    _ver = _package + "-" + spoke + ".tar.gz" ## Compiles the package name, ver #, and extension 
    _down(_user, _ver, _package) ## Opens information in download module 
+1

我想不出一個邏輯功能,這將使1.14比1.6還要大。 –

回答

3

編輯:對不起,誤解首先的問題 - 看this answer瞭解有關比較版本號的幾種方法。以在那裏的第二個答案(這表明使用distutils.versionStrictVersion),你可以試試這個:

In [3]: from distutils.version import StrictVersion 

In [4]: s = ['1.04','1.6','1.14', '2.02.04', '1.14.01'] 

In [5]: max(s, key=StrictVersion) 
Out[5]: '2.02.04' 

有一點要注意的是,你實際上是比較字符串,而不是數字。有一兩件事可以做,以確保您比較的數量本身(無論您想與事後的項目做)是提供一鍵max功能:

In [1]: s = ['1.04','1.6','1.14'] 

In [2]: max(s, key=float) 
Out[2]: '1.6' 

既然你正在尋找比較浮值(而不是字符串),這比較了字符串的float等值。然而,它可能是最好的,然後再繼續那些轉換爲浮動:

In [4]: s = ['1.04','1.6','1.14'] 

In [5]: s_floats = [float(x) for x in s] 

In [6]: s_floats 
Out[7]: [1.04, 1.6000000000000001, 1.1399999999999999] 

然後可以使用最大爲你想到:

In [9]: max(s_floats) 
Out[9]: 1.6000000000000001 
+0

那些lambda是不需要的。 'max(s,key = StrictVersion)'與max(s,key = lambda x:StrictVersion(x))和'max(s,key = float)相同'max(s,key = lambda x:float(x))' –

+0

@ jwpat7啊,你是完全正確的。我不知道爲什麼,但我每次都這樣做(不必要的lambdas) - 讓我們希望這是最後一次:)感謝您指出它,將會調整。 – RocketDonkey

0

你可以使用每個程序的版本將被存儲爲另一列表列表,因爲這:

列表= [[1,14],[1,6],[1,4]]

,其中每個版本componnent是內部列表的一部分。

然後你可以這樣排序是:

sortedlist = sorted(sorted(sorted(list, key=lambda x: x[2]), key=lambda x: x[1]),key=lambda x: x[0]) 
1

你需要比較大的版本,然後連續次要版本。最大函數接受,你可以用它來修改相媲美,由字符串轉換成的主要和次要版本

>>> max(array, key = lambda e: map(int, e.split("."))) 
'1.14'