2017-01-07 50 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)