Сортировка списка разделенных точками чисел, например, версий программного обеспечения - PullRequest
56 голосов
/ 04 апреля 2010

У меня есть список, содержащий строки версий, например:

versions_list = ["1.1.2", "1.0.0", "1.3.3", "1.0.12", "1.0.2"]

Я бы хотел отсортировать его, поэтому результат будет примерно таким:

versions_list = ["1.0.0", "1.0.2", "1.0.12", "1.1.2", "1.3.3"]

Порядок старшинства цифр, очевидно, должен быть слева направо и по убыванию. Так что 1.2.3 предшествует 2.2.3, а 2.2.2 предшествует 2.2.3.

Как мне это сделать в Python?

Ответы [ 4 ]

111 голосов
/ 04 апреля 2010

Вы также можете использовать distutils.version модуль стандартной библиотеки:

from distutils.version import StrictVersion
versions = ["1.1.2", "1.0.0", "1.3.3", "1.0.12", "1.0.2"]
versions.sort(key=StrictVersion)

Дает вам:

['1.0.0', '1.0.2', '1.0.12', '1.1.2', '1.3.3']

Он также может обрабатывать версии с тегами предварительного выпуска, например:

versions = ["1.1", "1.1b1", "1.1a1"]
versions.sort(key=StrictVersion)

Дает вам:

["1.1a1", "1.1b1", "1.1"]

Документация: https://github.com/python/cpython/blob/3.2/Lib/distutils/version.py#L101

75 голосов
/ 04 апреля 2010

Разделить каждую строку версии, чтобы сравнить ее как список целых чисел:

versions_list.sort(key=lambda s: map(int, s.split('.')))

Дает, для вашего списка:

['1.0.0', '1.0.2', '1.0.12', '1.1.2', '1.3.3']

В Python3 map больше не возвращает list, поэтому нам нужно обернуть его в list вызов .

versions_list.sort(key=lambda s: list(map(int, s.split('.'))))

Альтернативой карте здесь является понимание списка . См. этот пост для более подробной информации о списках.

versions_list.sort(key=lambda s: [int(u) for u in s.split('.')])
13 голосов
/ 15 июля 2015

нацорт предлагает "естественную сортировку"; который работает очень интуитивно (в Python 3)

from natsort import natsorted
versions = ["1.1.2", "1.0.0", "1.3.3", "1.0.12", "1.0.2"]
natsorted(versions)

дает

['1.0.0', '1.0.2', '1.0.12', '1.1.2', '1.3.3']

, но он работает и для полных имен пакетов с номером версии:

versions = ['version-1.9', 'version-2.0', 'version-1.11', 'version-1.10']
natsorted(versions)

1012 * дает *

['version-1.9', 'version-1.10', 'version-1.11', 'version-2.0']
1 голос
/ 20 июня 2017

Я также решил этот вопрос с помощью Python, хотя моя версия делает некоторые дополнительные вещи, вот мой код:

def answer(l):
    list1 = [] # this is the list for the nested strings
    for x in l:
        list1.append(x.split("."))
    list2 = [] # this is the same list as list one except everything  is an integer in order for proper sorting
    for y in list1:
        y = map(int, y)
        list2.append(y)
    list3 = sorted(list2) #this is the sorted list of of list 2
    FinalList = [] # this is the list that converts everything back to the way it was
    for a in list3:
        a = '.'.join(str(z) for z in a)
        FinalList.append(a)
    return FinalList

Для версий существует три вещи; Майор, минор и ревизия. То, что это делает, - то, что это организует это так, чтобы '1' предшествовал '1.0', который предшествует '1.0.0'. Кроме того, еще один плюс, нет необходимости импортировать какие-либо библиотеки, если у вас их нет, и он работает со старыми версиями Python, этот был специально предназначен для версии 2.7.6. Во всяком случае, вот несколько примеров:

Inputs:
    (string list) l = ["1.1.2", "1.0", "1.3.3", "1.0.12", "1.0.2"]
Output:
    (string list) ["1.0", "1.0.2", "1.0.12", "1.1.2", "1.3.3"]

Inputs:
    (string list) l = ["1.11", "2.0.0", "1.2", "2", "0.1", "1.2.1", "1.1.1", "2.0"]
Output:
    (string list) ["0.1", "1.1.1", "1.2", "1.2.1", "1.11", "2", "2.0", "2.0.0"]

Если у вас есть какие-либо вопросы, просто прокомментируйте ответ !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...