-1

FTP 経由で Web サイトに接続し、Web サイトにあるプログラムの現在のバージョン番号を一覧表示する Python スクリプトがあります。スクリプトが配列から最大の番号を選択し、それが何であるかを教えてくれるまで、バージョン番号を保持する配列を作成しました。たとえば、私の配列は通常次のようになります。

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

だから私は使った...

max_in_array = max(array) 

配列内の最大値を返します。

残念ながら、実際には「1.14」が最新のバージョン番号であるのに、最大の番号として「1.6」を受け取りました。他に考えられる唯一のことは、「1」を切り取ることです。私が受け取るように配列のリストから:

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

それを再度貼り付けて、完全なバージョン番号を取得します。しかし、この Web サイトには '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 
4

4 に答える 4

3

編集:申し訳ありませんが、最初は質問を誤解していました-バージョン番号の比較に関するいくつかの方法については、この回答を参照してください。そこにある2番目の答え(distutils.version'sを使用することを示唆してい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'

注意すべきことの 1 つは、実際には数値ではなく文字列を比較していることです。数値自体を比較していることを確認するためにできることの 1 つは (後で項目を処理することを無視して)、max関数にキーを提供することです。

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

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

float 値 (文字列ではなく) を比較しようとしているので、これは文字列の float 値を比較します。ただし、先に進む前にこれらを 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]

その後、期待どおりに max を使用できます。

In [9]: max(s_floats)
Out[9]: 1.6000000000000001
于 2012-12-27T16:45:08.760 に答える
1

メジャー バージョンに続いてマイナー バージョンを連続して比較する必要があります。Max 関数は、文字列をメジャー バージョンとマイナー バージョンのタプルに変換することにより、同等のものを変更するために使用できるキー引数を受け入れます。

>>> max(array, key = lambda e: map(int, e.split(".")))
'1.14'
于 2012-12-27T17:05:14.113 に答える
0

次のように、各プログラムバージョンが別のリストとして保存されるリストを使用できます。

リスト=[[1,14]、[1,6]、[1,4]]

ここで、各バージョンコンポーネントは内部リストの一部です。

次に、次のように並べ替えることができます。

sortedlist = sorted(sorted(sorted(list, key=lambda x: x[2]), key=lambda x: x[1]),key=lambda x: x[0])
于 2012-12-27T16:49:41.543 に答える
0

バージョン番号では、異なる分割番号を再生し、最初に mayor_version で比較し、後で minor_version で比較する必要があります。

誰かがこの前に解決したと確信しています...

グーグル検索したら…

はい!!確かにPythonの人。これをチェックして:

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

于 2012-12-27T17:15:46.070 に答える