2017-03-04 1 views
0

J'ai commencé à apprendre Python 3 il y a quelques jours, donc si mon code est mauvais, je m'excuse.Distance minimum de Hamming

J'ai écrit un script pour trouver le minimum Hamming distance de chaînes dans une liste. Maintenant, les chaînes que j'utiliserai sont des mots binaires de la même longueur, donc ma première question est-ce qu'il y a une solution binaire à cela en Python?

Deuxièmement, mon code est-il correct et, si oui, quelle est la meilleure approche pour améliorer l'efficacité? Mes recherches n'ont pas retourné Python 3 réponses, c'est pourquoi je demande ici.

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 

Un grand merci

+0

les entiers peuvent avoir une longueur arbitraire? Ou ont-ils une longueur maximale? –

+0

Dans ce cas, ils sont corrigés. J'ai écrit ceci pour résoudre un problème assez simple avec une liste de 16 mots binaires de longueur 12. Il était censé être résolu par la vue, mais j'ai pensé qu'un script serait le meilleur pour réduire l'erreur humaine. Ce serait bien de voir le script applicable pour des longueurs arbitraires. – Necessary

+0

Il y a un exemple Python 3 juste et succinct sur cette page wikipédia;) Il montre essentiellement ce dont vous avez besoin pour faire ce travail: utilisez zip() pour zipper les deux chaînes d'entrée si elles ont la même longueur, puis comparez chaque paire dans le zip, en gardant le compte de combien sont inégaux. – Dartmouth

Répondre

0

Vous pouvez également utiliser scipy (pdist) pour cela, mais vous devez changer d'entrée à un tableau 2D. il renvoie la distance de hamming en tant que fraction. Pour cela, vous devez chaînes avec des nombres (chaînes binaires sont ok):

from scipy.spatial.distance import pdist 

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