2017-07-18 1 views
1

J'écris une fonction pour inverser une chaîne, mais elle ne la termine pas jusqu'à la fin. Est-ce que j'ai râté quelque chose?Python: l'inversion de chaîne s'arrête à mi-chemin

def reverse_string(str): 
    straight=list(str) 
    reverse=[] 
    for i in straight: 
     reverse.append(straight.pop()) 
    return ''.join(reverse) 

print (reverse_string('Why is it not reversing completely?')) 
+0

Merci @JohnColeman pour la clarification. J'étais juste curieux de savoir pourquoi cette logique échoue. oui, c'est une mauvaise idée; le défi du code du site avait «str» et je ne l'ai pas changé – Sri

Répondre

5

Le problème est que vous pop éléments de l'original et ainsi changer la longueur de t Il liste, donc la boucle s'arrêtera à la moitié des éléments.

Typiquement, cela est résolu en créant une copie temporaire:

def reverse_string(a_str): 
    straight=list(a_str) 
    reverse=[] 
    for i in straight[:]: # iterate over a shallow copy of "straight" 
     reverse.append(straight.pop()) 
    return ''.join(reverse) 

print(reverse_string('Why is it not reversing completely?')) 
# ?yletelpmoc gnisrever ton ti si yhW 

Toutefois, en cas de vous renverser pouvez utiliser déjà des alternatives existantes (plus facile):

Slicing:

>>> a_str = 'Why is it not reversing completely?' 
>>> a_str[::-1] 
'?yletelpmoc gnisrever ton ti si yhW' 

ou le reversed itérateur:

>>> ''.join(reversed(a_str)) 
'?yletelpmoc gnisrever ton ti si yhW' 
+0

Merci pour la réponse détaillée @MSeifert. Pourquoi la boucle s'arrête-t-elle à mi-chemin, quelle qu'en soit la raison? – Sri

+1

Supposons que la liste comporte 4 éléments bien avant la boucle. Dans la première itération, il donne le premier élément, puis vous faites apparaître un élément (nouvelle longueur = 3), l'itération suivante il vous donne le deuxième élément et apparaît un autre (nouvelle longueur = 2), l'itération suivante que la boucle vous donnerait le troisième élément, mais parce que la liste a seulement 2 longueur maintenant il s'arrête là. Le fait qu'il divise par deux la liste est parce que vous déposez un élément dans chaque itération (consommant ainsi 2 éléments par itération). :) – MSeifert

+1

«tout droit» a plus de sens que d'itérer sur une copie, étant donné que les éléments de la copie sont complètement ignorés de toute façon. Juste pop jusqu'à ce qu'il n'y a plus rien. – user2357112

1

En python, vous pouvez utiliser les étapes iterator pour inverser une chaîne

print('hello'[::-1]) 

renversera la chaîne

1

Il y a un moyen plus facile d'inverser:

>>> 'my string'[::-1] 
'gnirts ym' 
0

Vous pouvez utiliser la boucle du dernier index de la liste à zéro index puis append dans une autre liste, puis join pour obtenir inverser Tring.

def reverse_string(str): 
    straight=list(str) 
    print straight 
    reverse=[] 
    for i in range(len(straight)-1,-1,-1): 
     reverse.append(straight[i]) 
    return ''.join(reverse) 


print (reverse_string('Why is it not reversing completely?'))