2012-05-20 39 views
1

我想知道,我如何增加一個代表二進制數字的字符串,直到另一個二進制數字? (例如,用於while循環)。例如我從「0000」開始,在15個incs之後,我應該達到「1111」(換句話說:「0000」,「0001」,「0010」,...,「1111」)。起初這個問題看起來非常簡單,但我能想出的唯一解決方案非常荒謬(不是pythonic,有人可能會這麼說)。有沒有人有建議?在python中增加一個二進制數字

在此先感謝!

+3

「0002」 ...嗯...什麼?! –

+5

是否有一個原因,你想從字符串開始,而不是爲了顯示而轉換爲字符串的整數? – Levon

+2

@Mark Byers我對此沒有合理的解釋。捂臉。 – Py42

回答

5

做你從字面上問你要轉換爲整數,加一個,又變回爲二進制。

x = to_binary(int(x, 2) + 1) 

您可能會發現bin內置的方法在實施to_binary有用的,雖然你會需要稍微修改其輸出以滿足您的期望的結果。

但是它會更好,如果可能的話不要來回轉換:只存儲一個整數,並將其轉換爲二進制當你需要顯示它。

在閱讀您的問題仔細不過,這一切似乎你想要做的是生成字符串'0000''0001''0010'等。如果這是正確的,那麼我建議使用itertools.product

例子:

import itertools 
for x in map(''.join, itertools.product('01', repeat=4)): 
    print x 

0000 
0001 
0010 
... 

看到它聯機工作:ideone

+0

多麼巧妙的解決方案!我永遠不會想出這個。我一再對Python所提供的東西感到驚訝。 謝謝=] – Py42

3
>>> def increment_binary_string(s): 
... return '{:04b}'.format(1 + int(s, 2)) 
... 
>>> x = '0000' 
>>> for _ in xrange(15): 
... print x 
... x = increment_binary_string(x) 
... 
0000 
0001 
0010 
0011 
0100 
0101 
0110 
0111 
1000 
1001 
1010 
1011 
1100 
1101 
1110 
+0

這類似於一個溶液我嘗試中,問題是,它返回「1」,而不是「0001」(I結合時與只用焊盤前導零的結果的填充功能)。 – Py42

+1

哦,好吧,爲前導零,您可以使用'str.format'(見編輯) – wim

+0

順便說一句,我與馬克同意關於真正的答案,這是剛剛與整數工作,並轉換爲顯示必要時 – wim

1

短期和簡單的使用默認功能bin()

>>> for i in range(15): 
...  print bin(i) 
... 
0b1 
0b10 
0b11 
0b100 
0b101 
0b110 
0b111 
0b1000 
0b1001 
0b1010 
0b1011 
0b1100 
0b1101 
0b1110 
0b1111 

如果你不喜歡他們從0b前綴開始,您可以改爲使用print str(bin(i))[2:]

1

這是簡單的有彬()和zfill做()。

>>> for x in range(16): 
...  print bin(x)[2:].zfill(4) 
... 
0000 
0001 
0010 
0011 
0100 
0101 
0110 
0111 
1000 
1001 
1010 
1011 
1100 
1101 
1110 
1111 

或者你可以把值列表中的一個理解:

>>> [bin(x)[2:].zfill(4) for x in range(16)] 
['0000', '0001', '0010', '0011', '0100', '0101', '0110', '0111', '1000', '1001', '1010', '1011', '1100', '1101', '1110', '1111']