2012-12-27 2 views
-1

У меня есть сценарий Python, который подключается к веб-сайту через FTP и перечисляет текущие номера версий программ, расположенных на веб-сайте. Я создал массив для хранения номеров версий, пока скрипт не выберет наибольшее количество из массива и не скажет мне, что это было. Например мой массив обычно выглядит следующим образом:Python - Возвращает максимальное число в массиве. Ошибки

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

Так что я использовал ...

max_in_array = max(array) 

вернуть наибольшее значение в массиве.

К сожалению, я получил «1.6» как наибольшее число, когда, по сути, «1.14» - это последний номер версии. Единственное, что я мог подумать - это отрезать «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

Edit: К сожалению, неверно истолковали вопрос на первом - см this answer несколько методов, касающихся сравнения номера версий. Принимая во второй ответ там (который предлагает использовать distutils.version «ы StrictVersion), вы можете попробовать это:

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' 

Поскольку вы хотите сравнить поплавка (а не строки), это сравнивает поплавковые эквиваленты строк. Однако это может быть лучше для преобразования тех поплавков, прежде чем продолжить:

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

Эти лямбды не нужны. 'max (s, key = StrictVersion)' такой же, как 'max (s, key = lambda x: StrictVersion (x))' и 'max (s, key = float)' такой же, как 'max (s, key = lambda x: float (x)) ' –

+0

@ jwpat7 Ах, ты совершенно прав. Я понятия не имею, почему, но я делаю это буквально каждый раз (ненужные лямбды) - будем надеяться, что это в последний раз :) Спасибо за то, что указали это, настройтесь. – 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' 
0

В номерах версии вы должны играть разные, отделенные номера и сравнить по mayor_version первого и minor_version позже.

Я уверен, что кто-то решил на этот раз назад ...

после поиска Google ...

Да !! Ребята Python действительно. Проверьте это:

http://pydoc.org/get.cgi/usr/local/lib/python2.5/distutils/version.py

Смежные вопросы