我正在尝试用二进制计算两个字符串之间的汉明距离。但是我没有得到37的预期输出。相反,我得到33.有人可以向我解释我正在犯的错误吗?
这是我的代码:
def to_bin(s):
return ''.join(format(ord(x), 'b') for x in s)
s1 = to_bin('this is a test')
s2 = to_bin('wokka wokka!!!')
def hamming_distance_bin(x,y):
z = []
for i,j in zip(x,y):
z.append(ord(i)^ord(j))
return z.count(1)
print hamming_distance_bin(s1,s2)
我使用上面的列表的原因是,我可以打印我的xor'd输出来手动计算1并看看我出错的地方。但我似乎不明白!
答案 0 :(得分:2)
def to_bin(s):
return ''.join(format(ord(x), 'b') for x in s)
返回一个可变长度的二进制字符串。你想输出一个恒定长度的:
def to_bin(s):
return ''.join(format(ord(x), '08b') for x in s)
FWIW,我做了:
s1 = bytearray(b'this is a test')
s2 = bytearray(b'wokka wokka!!!')
def hamming_distance_bin(x,y):
return sum(bin(i^j).count("1") for i,j in zip(x,y))
hamming_distance_bin(s1,s2)
因为bytearray
比始终致电ord
更整洁。
答案 1 :(得分:0)
您还可以为每个字符使用bin().zfill(8)
,从而解决您遇到的问题。
上面的答案是好的代码;另一种方法就是:
def hamming(str1, str2):
score = 0
for (a, b) in izip(str1, str2):
a_bits = bin(ord(a))[2:].zfill(8)
b_bits = bin(ord(b))[2:].zfill(8)
score += sum(bx != by for bx, by in izip(a_bits, b_bits))
return score
我认为,这样做的好处是字符串到二进制转换内置于函数本身。