'float' objet ne peut pas être interprété comme int, mais la conversion de int rendements pas de sortie
Donc, je suis en train de tester, si quelque chose est un palindrome. Voici mon code:
Cette fonction retourne une chaîne de caractères de la première moitié d'une chaîne plus longue. ("TEST" retourne "TE", "BONJOUR") renvoie "IL")
def takeStart(s):
start = ""
# The following determines the final index of the first half
if len(s)%2==0:
a = (len(s)/2)-1
else:
a = ((len(s)-1)/2)-1
for i in range(a):
start+=s[i]
return start
Cette fonction retourne une chaîne de caractères de la seconde moitié d'une chaîne plus longue. ("TEST" retourne "ST", "BONJOUR") renvoie "LO")
def takeEnd(s):
end = ""
# The following determines the beginning index of the second half
if len(s)%2==0:
a = (len(s)/2)
else:
a = ((len(s)-1)/2)
for i in range(a,len(s)):
end+=s[i]
return end
Cette fonction retourne une chaîne de caractères. ("TEST" retourne "TSET", "BONJOUR") renvoie "OLLEH")
def flip(s):
flipped = ""
for i in range(1,len(s)):
flipped+=s[len(s)-i]
flipped+=s[0]
return flipped
Ce code prend chaque produit de deux nombres de 3 chiffres, et vérifie si c'est un palindrome
for i in range(100,1000):
for q in range(100,1000):
a = i*q
if takeStart(str(a)) == flip(takeEnd(str(a))):
print(str(a))
Lorsque ce code est exécuté, il affiche:
Traceback (most recent call last):
File "[redacted]", line 39, in <module>
if takeStart(str(a)) == flip(takeEnd(str(a))):
File "[redacted]", line 14, in takeStart
for i in range(a):
TypeError: 'float' object cannot be interpreted as an integer
Bien, j'ai pensé que je viens de convertir un nombre entier et que tout devrait être fait enfler.
Faire qui apparaît à supprimer toutes les erreurs, mais il n'y a PAS de sortie que ce soit. (Il y a de nouvelles lignes à chaque fois ce qui me fait penser ça fonctionne mais pas outputing des données)
Toutes les idées sur le pourquoi de ce qui se passe?
Mise à JOUR: mon code maintenant:
def takeStart(s):
start = ""
if len(s)%2==0:
a = (len(s)//2)
else:
a = (len(s)-1)//2
return start[0:a]
def takeEnd(s):
end = ""
if len(s)%2==0:
a = (len(s)//2)
else:
a = ((len(s)-1)//2)
return end[int(a):len(s)]
def flip(s):
return s[::-1]
for i in range(100,1000):
for q in range(100,1000):
a = i*q
if takeStart(str(a)) == flip(takeEnd(str(a))):
print(str(a))
C'est juste à la sortie de chaque numéro.
J'ai testé chaque méthode et ils sont de retour les cordes à vide. (Je suppose), qui est la raison pour laquelle chaque nombre est le passage du palindrome de vérifier et d'impression.
Comme une note de côté, vous êtes ce qui en fait un beaucoup plus difficile qu'il doit être. Par exemple, au lieu de boucler sur les indices un par un, il suffit d'utiliser une tranche.
On dirait que vous êtes à l'aide de Python 3, où le
a
finit un float
comme un résultat de la division des opérations... Vous pouvez forcer la division entière à l'aide de //
à la place, mais je n'ai pas trop pensé, si c'est ce que vous voulez faire... comme @abarnet mentionne - il y a beaucoup plus simple des façons de le faire (qui ressemble à une Euler défi...)
OriginalL'auteur Cortney Reagle | 2013-10-22
Vous devez vous connecter pour publier un commentaire.
D'abord, à l'aide de
range(int(a))
etrange(int(a), len(s))
permettra de résoudre votre erreur. Comme Jon Clements points, vous pouvez résoudre plus facilement en utilisant simplement//
au lieu de/
pour obtenir des entiers dans la première place. Mais de toute façon, c'est de ne pas causer de problèmes.Votre problème, c'est que
range
s, et juste au sujet de tout ce qui est lié à Python, sont à moitié ouvertes. Donc, votretakeStart
fonction retourne toutes les valeurs jusqu'à, mais ne comprenant pas, le point à mi-chemin, il vous donneH
pourHELLO
,T
pourTEST
,BIGG
pourBIGGERTEST
.Simplement se débarrasser de la
-1
sur votrea = …
lignes, et qui permettra de résoudre ce problème.Et puis il imprime tout un tas de lignes de sortie, tous les palindromes, ce qui je suppose est ce que vous avaient l'intention de le faire.
Cependant, vous n'êtes toujours pas aller pour obtenir toute la longueur impaire palindromes. Par exemple, avec "MADAME", même quand vous obtenez les fonctions de droit,
takeStart(s)
estMA
,takeEnd(s)
estDAM
,flip(takeEnd(s))
estMAD
, et ce n'est pas le même queMAD
. Même si vos fonctions sont le droit de travailler, ils ne sont pas de résoudre le problème. Donc, il y a un bug dans votre conception ainsi que votre mise en œuvre. Si vous pensez à ce sujet pendant un certain temps, vous devez comprendre comment faire ce travail.Et, une fois que vous faites, vous devez réaliser que
takeStart
ettakeEnd
peut être simplifié beaucoup de choses. (Astuce: Dans quels cas avez-vous vraiment besoin pour traiter les paires et impaires longueurs différemment?)Pendant que nous y sommes, c':
... est juste un bavard, trop lent et facile-à-obtenir-mauvais sens de cette écriture:
Et, de même, l'ensemble de votre
flipped
la fonction est:Génial. Mon seul problème maintenant est en dehors des limites d'exception lors de l'ajout de personnages à
flipped
dans la fonctionflip
. Est-il possible que vous pouvez faire l' [x:y] chose à revenir en arrière?D'accord... même si c'est plus facile de comprendre comment simplifier les choses si il travaille autour de la
HEL
/LLO
problème avant écrittake_middle
...Oui, complètement spécifié par tranches de ressembler à
[start:end:step]
. Les valeurs par défaut sont (effectivement)0
,len(s)
, et1
, mais vous pouvez spécifier ce que vous voulez, y compris des nombres négatifs.J'ai déjà eu une take_middle fonction, mais juste comme vous l'avez dit, je les ai séparés pour le rendre plus facile pour moi de travailler des choses
OriginalL'auteur abarnert