Я пытаюсь преобразовать номера версий приложений, таких как 5.3.0.1 (Android) и 5.3.0 (iOS), в целые числа в Python. Функция должна выдавать выходные значения 5301 для Android и 530 для iOS.

Я написал следующий код, но хочу сделать его меньше и лучше:

version = "5.3.0"
num = (version).split('.')

for i in num:
    version += i

print version

Предложите мне несколько лучших вариантов!

4
Suraj Bhatia 7 Янв 2017 в 03:49

6 ответов

Лучший ответ
version = "5.3.0"

int(version.replace(".", ""))
# 530

Это должно работать до тех пор, пока версия не начинается с 0, иначе просто не конвертируйте их в целые числа.

-1
Psidom 7 Янв 2017 в 00:52

Возможно, что-то более прямое:

major, minor, patch = [int(x, 10) for x in version.split('.')]

Вышеприведенное даст вам каждый компонент номера версии. Вы также можете сделать что-то вроде:

l = [int(x, 10) for x in version.split('.')]
l.reverse()
version = sum(x * (100 ** i) for i, x in enumerate(l))

Это позволит каждому компоненту номера версии варьироваться от 0 до 99 (а не только от 0 до 9). Это довольно распространенная практика в C для записи номеров версий.

Если вы действительно хотите обрабатывать компоненты версии в диапазоне от 0 до 9, просто измените 100 на 10:

l = [int(x, 10) for x in version.split('.')]
l.reverse()
version = sum(x * (10 ** i) for i, x in enumerate(l))
9
John Szakmeister 7 Янв 2017 в 01:15

В Python 2 1 используйте метод translate:

version = "5.3.0"
print "Prior:",version
version = int(version.translate(None, '.'))
print "After:",version

Который дает:

Prior: 5.3.0
After: 530

1 В Python3, сопоставимый скрипт будет выглядеть так:

version = "5.3.0"
print("Prior:",version)
version = int(version.translate({ord('.'): None}))
print("After:",version)
0
boardrider 7 Янв 2017 в 22:36

Это можно сделать с помощью довольно простого выражения генератора:

>>> version = "5.3.0"
>>> int(''.join(c for c in version if c != '.'))
530
>>> 

Или вы можете просто использовать .split() и сохранить себе шаг:

>>> version = "5.3.0"
>>> int(''.join(version.split(".")))
530
>>> 

В случае, если производительность имеет значение, вот время для различных методов, скомпилированных из разных ответов:

Method: int(version.replace(".", ""))
Time: 0.4673201900150161
---------
Method: int(''.join(x for x in version.split('.')))
Time: 1.2946192430099472
---------
Method: int(''.join(c for c in version if c != '.'))
Time: 1.248846340982709
---------
Method: int(''.join(version.split(".")))
Time: 0.5846817549900152
---------
Method: [int(x, 10) for x in version.split('.')]
Time: 1.2502875960199162

Отказ от ответственности: я не одобряю, не принимаю кредит или рекомендую любое из решений выше. Кредит из-за оригинальных авторов. Цель приведенной выше таблицы - дать ОП достаточно точное измерение эффективности каждого метода.

0
Christian Dean 7 Янв 2017 в 01:14

Самый простой способ сделать это было бы просто

version = "5.3.0"
int(version.replace(".", ""))

Это даст вам 530

Однако, если версия начинается с 0, например version = 0.1.1, вам просто нужно сделать

version.replace(".", "")

Чтобы не потерять 0 впереди.

1
UnsignedByte 7 Янв 2017 в 01:07

Это работает для вас?

int(''.join(x for x in version.split('.')))
1
aws_apprentice 7 Янв 2017 в 00:53