2017-01-07 989 views
0

我试图将应用程序版本号如5.3.0.1(Android)和5.3.0(iOS)转换为Python中的整数。该函数应该为Android提供5301的输出值,为iOS提供530。如何将版本号转换为整数值?

我写了下面的代码,但希望使其体积更小,更好:

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

for i in num: 
    version += i 

print version 

建议我一些更好的选择!

+0

'INT( “”。联接(version.split( “”)))'' – Li357

+0

INT( ''。加入(version.split( '')))'不要忘记真正使它一个号码。 – TemporalWolf

+9

要小心......如果任何组件都可以> 9,转换可能会导致歧义,例如是'5100'相当于'5.10.0'还是'5.1.0.0'? – ThisSuitIsBlackNot

回答

2
version = "5.3.0" 

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

这应该工作,只要该版本不以0开头,否则,不要将它们转换为整数。

+0

为什么领先的0是一个问题?我不认为有大约除非你如果转换从0开始转变为int一个字符串指定基本为0。 – jszakmeister

+1

,0取出它被视为八进制的任何问题。 – UnsignedByte

+0

为什么那么重要?这是一个整数,可能你会将它与一个整数进行比较。 :-)什么是导入的版本进行比较,你所希望的方式,他们将只要每个组件是9个或更少。 – jszakmeister

7

也许一些更直接:

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)) 
+0

我仍然认为这是更复杂的算法。我喜欢用替代:)干得好,虽然 – UnsignedByte

+1

嗯,这是比什么OP问一个稍微不同的解决方案。在这里,您可以单独获取每个组件,而不是将所有组件合并为一个整数 - 至少是我提供的第一个解决方案谢谢你的荣誉。 :-) – jszakmeister

+0

将组件分离出来是**正确**的方式来做到这一点。 – TemporalWolf

1

这是否适合您?

int(''.join(x for x in version.split('.'))) 
+3

'x for x in' does not add anything to the solution ...'ver.split(“。”)== list(x for ver.split(“。”))''True' – TemporalWolf

+0

...和'''.join(version.split('。'))'等于'version.replace('。','')'。 – jszakmeister

+1

谢谢你让我知道。我对Python还是比较新的。 @TemporalWolf –

1

这可以通过使用一个相当简单的生成器表达式来完成:

>>> 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 

声明:我不赞同,赞扬或推荐上述任何解决方案。信用归功于原作者。以上图表的目的是为了给OP一个相当准确的测量每种方法的性能。

2

这样做,这将是最简单的方法简单地

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

这将使你530

但是,如果版本0开始,例如version = 0.1.1,你应该简单地做

version.replace(".", "") 

避免在前面丢掉0。

+1

这不是一个整数,而是一个字符串。 – DyZ

0

在Python 2 ,使用translate方法:

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

其中给出:

Prior: 5.3.0 
After: 530 

Python3,可比脚本将是:

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