2016-09-29 72 views
2

我已經有一個算法,它已經這樣做了,但代碼是醜陋和緩慢的。我假設在庫中有一個內置或某些函數可以提供更快,更精確的結果。將前導零添加到一個字符串Python

我想要什麼地方可以給出最終的位數,字符串,列表或deque(最後可以轉換爲字符串的任何內容)。

func(totalBits, binaryInStringOrListForm) -> String or List with leading zeroes 

我已經得到的代碼如下:

val = deque(["1", "0"]) 

    while len(val) < 8: 

     val.appendleft("0") 

順便說一句,雙端隊列爲收藏對象的類型,可以讓你leftappend其中您可以將一個項目添加到開始的名單,而不必將所有事情都轉移一次。

這有些舊的答案,但它們都是Python 2,整個格式化的東西已經發生了很大的變化。

編輯:我認爲這個問題不是一個鏈接的重複,因爲我實際上在引導零後@Martijn Pieters讓我意識到。

編輯:好吧,它似乎是一個副本。抱歉關於這個騙局。

最後修改我感覺:我只是注意到了一些東西。嘗試使其長度爲一個字節時,我不斷收到像000b0110這樣的值。這與我想要的00000110相反。我只是補充一點,這樣如果其他人在未來查找這個問題,他們會發現正確的事情。因此,所有我所做的就是通過使用忽略字符串的前兩個字符:

val = val[2::].rjust(8, '0') 

我得到這個,因爲我談到了一些與「bin」的二進制數,它返回一個字符串在開始處有「0b」(聲明爲二進制)。

+0

爲什麼不直接使用字符串連接,如果你只需要追加爲零? –

+1

如果您追加*左*,您是不是添加**前導**零? –

+0

字符串是不可變的,因此Python將被迫爲每個新的連接字符串創建一個新字符串。這很慢。我需要快速這個。 – Frogboxe

回答

9

有一個內置的,str.ljust() method。它需要目標寬度和一個可選的填充字符(默認爲空格)。你可以用'0'字符用它墊一個字符串:

val = val.ljust(8, '0') 

還有一個相當於str.rjust() method到左邊添加填充。

但是,如果你想領先零(而不是結尾),我會用str.zfill() method作爲採取任何-+前綴考慮。

+0

謝謝。這就是我一直在尋找的東西。不能接受的答案,因爲stackoverflow給出了一個消息說:「你可以在8分鐘內接受答案」 – Frogboxe

+0

哦,是的,它是我需要的零。 – Frogboxe

1

您可以使用格式化的語言,但這個特殊的例子可能是不必要的:

>>> format('101', '<08') 
'10100000' 
>>> "{:<0{width}}".format('101', width=8) 
'10100000' 
+0

不知道爲什麼這是downvoted,它肯定不是一個錯誤的或無益的答案。請注意,當你只使用'format()'函數時,你不應該使用'str.format()':'format('101','<08')'給出了和第一個選項相同的結果,而不必分析字符串模板。 –

+0

我同意。無論如何也有兩種方法是很好的。我也贊成。 – Frogboxe

+0

好點,改變... – AChampion