2011-09-22 89 views
1

我剛剛學習python,學習語言的最好方法就是使用它,所以我認爲我會編寫一個腳本來比較二進制字,以確定哪些字是灰色的。二進制字符串比較

如果有一個不同的位,它應該標記記錄它是哪個數字的二進制代碼。舉例來說,如果N = 3,則二進制代碼是000,001,010,011,100,101,110,111

如果我選擇我的第一個二進制代碼爲010,那麼代碼應該返回110, 000,011作爲結果,或者優選指數0,3,6(或1,4,7)。

我的問題是這樣的:

什麼是做到這一點的最好的Python的方式,主要是我的目標以最快的代碼。

我的理由是,你們中的一些人會有更好的想法來做到這一點,然後我可以比較我的代碼,這將教會我更多。

+0

遠?你應該開始編寫一些代碼,測試它,如果它不起作用,那麼找出(或問)什麼改進。一旦完成,然後考慮優化。如果你想看到好的代碼示例,請查看github或cookbook網站,瞭解人們如何用python解決常見問題:http://code.activestate.com/recipes/langs/python/ – Lostsoul

回答

2

由於這是一個二進制計算問題(帶有一個奇怪的輸入),它不是真正的區域,您可以應用pythonic工具,如生成器,列表解析和itertools。

def neighbors(code, N=3): 
    num = int(code, 2) 
    return [num^(1 << (N-i-1)) for i in range(N)] 

如果你想輸出進行排序(的即0,3,6代替6,0,3),用途:

def neighbors_sorted(code, N=3): 
    num = int(code, 2) 
    return sorted(num^(1 << i) for i in range(N)) 
0

我想後我首次嘗試作爲第一個答案,但該網站阻止我身邊8小時,而我現在只能回覆。我已將代碼分成更重要的片段。

這是迄今爲止我嘗試:

我想我應該執行以下MODS的代碼如下:

1) Use dicts so that I have 0:000,1:001,... to improve the indexing. 
    2) Take the comparison string, adapt it to a list of all possible options 
     then compare this to the full binary list e.g. 010 becomes 110,000,011 
     and this is then is compared to the full binary list. 

我試圖創建二進制數的名單如下(不使用但類型的字典)

def BinaryNumberList(N=4): 
Bins=[] 
for Num in range(2**N): 
Bin='' 
for Pow in sorted(range(N),reverse=True): 
    Bin=Bin+str(Num/(2**Pow)) 
    Num=Num-Num/(2**Pow)*2**Pow 
    Bins.append(Bin) 
return Bins 

然後運行一個循環每串比較剩下的(目前不是最好的)

def GreySets(Bins): 
for Bin1 in Bins : 
    for Bin2 in Bins : 
    stringXOR(Bin1,Bin2) 

字符串XOR我從上interwebs有人偷別人的代碼了,它返回一個TrueFalseTrue(我需要它retrun不匹配位的數量),你嘗試過什麼這麼

def stringXOR(a, b): 
# Error Checking 
msg = "Strings do not have same length: %d, %d!" 
assert len(a) == len(b), msg % (len(a), len(b)) 
cnt = len(a) - 1 
# Code 
result = '' 
while cnt + 1: 
    result = `(a[cnt] != b[cnt])` + result 
    cnt = cnt - 1 
return result 
+0

這是非常複雜的,我沒有看到爲什麼要實施「mods」的任何理由。我在這裏讚揚我自己的角色,但爲什麼你的代碼更喜歡[我的雙線](http://stackoverflow.com/questions/7511476/binary-string-comparison/7511608#7511608)? – phihag

+0

嗨,我並不是說任何冒犯,我在你的回覆LostSould後發佈了我的n00b代碼,現在只能看到你的入口。這是輝煌的:D – Carel