#coding: utf-8 ''' mbinary ####################################################################### # File : hammingDistance.py # Author: mbinary # Mail: zhuheqin1@gmail.com # Blog: https://mbinary.xyz # Github: https://github.com/mbinary # Created Time: 2018-12-17 17:36 # Description: hamming distance is the number of different position (or binary bit for number) of two strings. eg 'abac', 'ab': 2 1010,11 : 3 ####################################################################### ''' def hammingDistance(a, b): if isinstance(a, int): n = a ^ b ct = 0 while n: ct += n % 2 n >>= 1 return ct else: n, m = len(a), len(b) ret = 0 for i, j in zip(a, b): ret += i == j return ret+abs(n-m) def totalHammingDistance(lst): '''return sum of any two items(num or lst( str)) in lst''' length = len(lst) if length == 0: return 0 if isinstance(lst[0], int): bits = [0] * len(bin(max(lst))) for n in lst: ct = 0 while n: if n % 2 == 1: bits[ct] += 1 ct += 1 n >>= 1 return sum(i*(length-i) for i in bits) else: mx = len(max(lst, key=len)) position = [dict() for i in range(mx)] for li in lst: for i, x in enumerate(li): if x in position[i]: position[i][x] += 1 else: position[i][x] = 1 ret = 0 for dic in position: left = length for i in dic.values(): ret += i*(left-i) # key step left -= i # key step return ret