2013-08-30 4 views
0

Mon objectif consiste à additionner la sortie générée à partir d'un code de manière itérative.sommation itérative de sortie générée par une fonction dans une boucle (python)

Le code ci-dessous permet de calculer avec précision la distance de Hamming entre les deux chaînes, mais ne résume pas les distances entre plusieurs chaînes. Voir cordes exemple ci-dessous:

w=['ground', 'joint'] 
c=['gnoufd', 'johnt'] 

def hamming_distance(s1, s2): 
    if len(s1)==len(s2): 
     return sum(x1 != x2 for x1, x2 in zip(s1, s2)) 

for x,y in zip(w,c): 
    for j in x: 
     for k in y: 
      l=hamming_distance(x, y) 
    print l 

La sortie du code ci-dessus est: 12 J'ai essayé d'utiliser la compréhension de la liste, en espérant que je pourrais obtenir la sortie dans une liste et de les résumer, mais a obtenu la sortie erronée.

for x,y in zip(w,c): 
    k=[hamming_distance(x,y) for j,k in zip(x,y)] 
    print k 

sortie souhaitée: 3 --- (la somme de l'un et deux ci-dessus)

Toutes les suggestions? Merci.

+0

Remarque: votre 'fonction hamming_distance' ne retourne rien si' LEN (s1) = len (s2) ', qui en Python signifie que la fonction retourne' Aucun '. C'est pourquoi vous obtenez TypeError: type (s) d'opérande non supporté (s) pour les erreurs +: 'int' et 'NoneType'' - vous essayez d'ajouter un 'int' à' None'. Vous devriez probablement décider quoi faire si 'len (s1)' et 'len (s2)' diffèrent, et modifiez 'hamming_distance' en conséquence. Ou, si les distances de Hamming ne sont définies que pour des chaînes de longueur égale, vous devrez soit vous assurer que vous ne passez que des chaînes de longueur égale, soit gérer les 'None's explicitement. – DSM

+0

Merci pour le commentaire DSM, je vais essayer d'utiliser l'exception. – Tiger1

+0

Plutôt que d'utiliser des exceptions, je pense que vous devez regarder comment vous êtes en boucle. Votre boucle «for j in x: for k in y:' ne comparerait pas seulement 'ground' avec' gnoufd' mais avec 'johnt' aussi. – DSM

Répondre

3

Dans ce bloc:

for x,y in zip(w,c): 
    for j in x: 
     for k in y: 
      l=hamming_distance(x, y) 
    print l 

vous n'utilisez pas j ou k, de sorte que vous pouvez vous débarrasser de ces boucles.

for x,y in zip(w,c): 
    l=hamming_distance(x, y) 
    print l 

Ceci est plus facilement traduit en une expression de générateur.

k = [hamming_distance(x, y) for x, y in zip(w,c)] 
print k 
print sum(k) 

Sortie:

[2,1] 
3 
+0

Salut, merci pour la solution.La raison pour laquelle j'ai utilisé la boucle for (j, k) est parce que j'utilise une liste de chaînes dans une liste ie [['ground', 'joint'], ['the', 'johnt']], et je reçois toujours un message d'erreur: TypeError: type (s) d'opérande non supporté (s) pour +: 'int' et 'NoneType'. Aucune suggestion? – Tiger1

+1

Ne pas utiliser une liste de chaînes dans une liste, alors. Utilisez deux variables qui sont chacune une liste de chaînes, tout comme votre problème d'origine indiqué. – Kevin

1

Au lieu de votre for boucle - il suffit d'utiliser map à la place en tant que tel:

diff = map(hamming_distance, w, c) 
# [2, 1] 
print sum(diff) 
# 3 
+0

Merci pour la solution John. Voici comment ma structure de données ressemble à: w = [[ 'terre', 'joint'], [ 'il', 'johnt']] c = [ 'gnoufd', 'johnt']. J'ai reçu le message d'erreur suivant lorsque j'ai appliqué votre solution en utilisant la structure de données: TypeError: type d'opérande non pris en charge (s) pour +: « int » et « NoneType » @ Kevin – Tiger1

Questions connexes