2017-03-04 130 views
0

我幾天前開始學習Python 3,所以如果我的代碼很差,我很抱歉。最小海明距離

我寫了一個腳本來查找列表中字符串的最小值Hamming distance。現在我將使用的字符串是相同長度的二進制字,所以我的第一個問題是在Python中是否有一個按位解決方案?

其次,我的代碼是否正確?如果是的話,提高效率的最佳方法是什麼?我的搜索沒有返回Python 3的答案,這就是爲什麼我在這裏問。

def min_ham_dist(a): 
    min_dist = len(a[0]) # Defaults minimum distance to maximum length of string. 
    for i in range(len(a)): 
     for j in range(i+1, len(a)): # Compares all words after ith word. 
      dist = 0 
      for k in range(len(a[i])): 
       if a[i][k] != a[j][k]: 
        dist += 1    
      if dist < min_dist: 
       min_dist = dist 
    return min_dist 

非常感謝

+0

整數是否可以有任意長度?或者他們有最大長度? –

+0

在這種情況下,它們是固定的。我寫了這個解決一個相當簡單的問題,用一個長度爲12的16個二進制單詞列表。它應該是通過視覺解決的,但是我覺得腳本最好能減少人爲錯誤。儘管可以看到該腳本適用於任意長度,但會很高興。 – Necessary

+0

這個維基百科頁面上有一個非常簡潔的Python 3示例;)它基本上顯示了你需要做什麼:使用zip()壓縮兩個輸入字符串,如果它們具有相同的長度,則比較每一對在zip中,保持有多少不相等的數量。 – Dartmouth

回答

0

您也可以使用這個SciPy的(pdist),但你必須改變輸入二維數組。它將漢明距離作爲分數返回。爲此,您需要帶數字的字符串(二進制字符串可以):

from scipy.spatial.distance import pdist 

def min_ham_dist(a): 
    return min(pdist([list(i) for i in a], 'hamming'))*len(a[0])