SORU
11 Kasım 2009, ÇARŞAMBA


Sürüm numarası karşılaştırma

Python bunun daha zarif bir çözüm olmalı ... belki biriniz yardımcı olabilir:

cmp-gibi bir işlevi sürüm sayılar için -1, 0 veya 1 dönen yazmak için, alt rasgele bir sayı için izin istiyorum.

Her alt bölüm, bir sayı olarak, 1.10 ^ bu nedenle yorumlanmış olması gerekiyordu . 1.1.

İstenilen çıkışı işlevi

mycmp('1.0', '1') == 0
mycmp('1.0.0', '1') == 0
mycmp('1', '1.0.0.1') == -1
mycmp('12.10', '11.0.0.0.0') == 1
...

Ve burada benim uygulama, gelişmeye açık

def mycmp(version1, version2):
    parts1 = [int(x) for x in version1.split('.')]
    parts2 = [int(x) for x in version2.split('.')]

    # fill up the shorter version with zeros ...
    lendiff = len(parts1) - len(parts2)
    if lendiff > 0:
        parts2.extend([0] * lendiff)
    elif lendiff < 0:
        parts1.extend([0] * (-lendiff))

    for i, p in enumerate(parts1):
        ret = cmp(p, parts2[i])
        if ret: return ret
    return 0

Python 2.4.5 btw kullanıyorum. (iş yerine de ... yüklü).

Burada küçük bir 'test paketi' kullanabilirsiniz

assert mycmp('1', '2') == -1
assert mycmp('2', '1') == 1
assert mycmp('1', '1') == 0
assert mycmp('1.0', '1') == 0
assert mycmp('1', '1.000') == 0
assert mycmp('12.01', '12.1') == 0
assert mycmp('13.0.1', '13.00.02') == -1
assert mycmp('1.1.1.1', '1.1.1.1') == 0
assert mycmp('1.1.1.2', '1.1.1.1') == 1
assert mycmp('1.1.3', '1.1.3.000') == 0
assert mycmp('3.1.1.0', '3.1.2.10') == -1
assert mycmp('1.1', '1.10') == -1

CEVAP
7 AĞUSTOS 2011, Pazar


Nasıl Python kullanarak distutils.version.StrictVersion hakkında?

>>> from distutils.version import StrictVersion
>>> StrictVersion('10.4.10') > StrictVersion('10.4.9')
True

cmp fonksiyon için:

>>> cmp = lambda x, y: StrictVersion(x).__cmp__(y)
>>> cmp("10.4.10", "10.4.11")
-1

distutils.version.LooseVersion daha yararlı olacak daha karmaşık sürüm numaralarını karşılaştırmak istiyorsanız, ancak, sadece aynı tür karşılaştırmak için emin olun.

>>> from distutils.version import LooseVersion, StrictVersion
>>> LooseVersion('1.4c3') > LooseVersion('1.3')
True
>>> LooseVersion('1.4c3') > StrictVersion('1.3')  # different types
False

LooseVersion en akıllı bir araç değildir, kolayca kandırılabilir:

>>> LooseVersion('1.4') > LooseVersion('1.4-rc1')
False

Bu cins ile başarı elde etmek, standart kütüphane ve kullanımı dışında adım gerekir distribute'nin ayrıştırma programı parse_version.

>>> from pkg_resources import parse_version
>>> parse_version('1.4') > parse_version('1.4-rc2')
True

Eğer belirli bağlı olarak harf kullanımı, distutils yerleşik araçlar yeterli olup olmadığını, ya da eğer 23 ** bir bağımlılık eklemek için garanti olup olmadığını karar gerekir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • akalyne

    akalyne

    13 Mayıs 2009
  • CaptainDisillusion

    CaptainDisil

    18 EYLÜL 2007
  • guau . .

    guau . .

    25 Ocak 2008