La comparaison des caractères dans les chaînes
Je suis en train de créer une fonction qui compare les caractères dans la même position des deux cordes de même longueur et retourne le nombre de leurs différences.
Par exemple,
a = "HORSE"
b = "TIGER"
Et il serait de retour 5 (comme tous les personnages dans la même position sont différents)
Voici ce que j'ai travaillé.
def Differences(one, two):
difference = []
for i in list(one):
if list(one)[i] != list(two)[i]:
difference = difference+1
return difference
Qui donne une erreur "indices Liste doivent être des entiers non chaînes"
Et donc j'ai essayé de le tourner vers int en utilisant int(ord(
def Differences(one, two):
difference = 0
for i in list(one):
if int(ord(list(one)[i])) != int(ord(list(two)[i])):
difference = difference+1
return difference
Qui renvoie également la même erreur.
Quand je liste d'impression(un)[1] != liste des(deux)[1] il eithers retourne True ou False, et que la comparaison est effectuée correctement.
Pouvez-vous me dire comment corriger mon code pour cela?
- La raison pour laquelle vous obtenez des erreurs, c'est parce que vous êtes une itération sur la chaîne avec la boucle for. En Python, lorsque vous effectuer une itération sur quelque chose (et - en aparté - vous n'avez pas besoin de convertir des chaînes de listes; les chaînes sont iterables par la nature en python), vous obtenez chaque sous-élément de l'élément en question (par opposition à un numéro d'index). Donc, vous obtenez
["H","O","R","S","E"]
que "je" valeurs en vous pour la boucle, qui ne sont évidemment pas des indices (c-à - 0,1,2,3,4).
Vous devez vous connecter pour publier un commentaire.
Je serais probablement juste de faire une itération sur les deux en même temps avec zip et une compréhension de liste, puis prendre la longueur de la liste:
Compression paires de listes ensemble index-index, ne s'arrêtant que lorsqu'on s'épuise. Interprétations de la liste sont des générateurs qui sont fondamentalement compact pour-les déclarations que vous pouvez ajouter de la logique. Donc, essentiellement, il se lit comme suit: pour chaque zippée paire de lettres (c,d) si c!=d ensuite, mettre une dans la liste (donc, si les lettres sont différentes, nous augmentons la liste de longueur par 1). Alors que nous venons de prendre la longueur de la liste, qui est de toutes les lettres qui sont en position différentes.
Si nous considérons les lettres manquantes d'être différents, alors nous pouvons utiliser itertools.zip_longest pour remplir le reste de la parole:
Évidemment, Rien ne pourra jamais égaler un personnage, de sorte que la différence de longueur sera enregistré.
EDIT: Cela n'a pas été mentionné, mais si nous voulons que l'insensibilité à la casse, alors que vous venez d'exécuter .bas() ou .casefold() sur les cordes à l'avance.
sum([int(i!=j) for i,j in zip(a,b)])
ferait l'affairezip
ne déclenche pas d'Exception, soitutilisation
zip
pour itérer sur les deux chaînes consécutivementaussi, le style général est en minuscules les noms de fonctions (qui sont souvent des verbes) et les majuscules des noms de classe (qui sont souvent des noms) 🙂
Vous pourriez faire quelque chose comme ceci:
La seule chose que vous aurez à mettre en œuvre vous-même, ici est la vérification de la taille des chaînes de caractères. Dans mon exemple, si
a
est plus grande queb
, alors il y aura unIndexError
.essayez ceci:
il est important de faire le premier contrôle de leur taille dans le cas où la deuxième chaîne est plus courte que la première, de sorte que vous n'avez pas de
IndexError
Que les questions liées à la complexité et à l'exécution, la liste d'appel() à chaque itération n'est pas efficace, car il divise les cordes, alloue de la mémoire et sur...
La manière correcte de le faire, c'est de réitérer la indice des listes, de les comparer en elle, quelque chose comme:
Il y a quelques problèmes avec:
Tout d'abord
list(one)
est['H', 'O', 'R', 'S', 'E']
lorsque vous appelezDifferences(a, b)
si vous êtes une itération sur les chaînes non ints. La modification de votre code:va itérer sur les entiers de 0 à 4 qui fonctionne dans votre cas seulement parce que
a
etb
ont la même longueur (vous aurez besoin de trouver une meilleure solution si vous souhaitez traiter des longueurs différentes entrées).D'autre part, vous ne pouvez pas ajouter à un tableau de sorte que vous devriez changer un
int
que vous ajoutez à. Le résultat serait:Si vous avez été super de garder à l'utilisation d'un tableau vous pouvez cependant ajouter à un tableau:
difference.append(1)
puis retourne la longueur de la table:return len(difference)
mais ce serait inefficace pour ce que vous essayez d'atteindre.Trouver par vous-même
Bonne chance!
Voir si cela fonctionne 🙂
C'est trop simple: