2017-07-18 104 views
1

我正在写一个函数来反转一个字符串,但直到最后它才完成。我在这里错过了什么吗?Python:字符串反向中途停止

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

感谢@JohnColeman的澄清。我只是好奇为什么这个逻辑失败了。是的,这是一个坏主意;来自网站的代码挑战'str',我没有改变它 – Sri

回答

5

问题是你从原来的元素pop,从而改变吨的长度他列出,所以循环将停止在一半的元素。

这通常是通过创建一个临时副本解决:在倒车,你可以使用已有的(容易)替代品的情况下

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 

但是:

切片:

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

reversed迭代器:

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

感谢@MSeifert的详细回复。为什么循环中途停止,具体原因是什么? – Sri

+1

假设列表在循环前长4个项目。在第一次迭代中,它给出第一个项目,然后你弹出一个项目(新的长度= 3),下一个迭代它给你第二个项目并弹出一个(新的长度= 2),循环将给你的下一个迭代第三项,但因为列表只有长度2,现在它停在那里。事实上它将列表减半是因为在每次迭代中弹出一个元素(从而每次迭代消耗2个项目)。 :) – MSeifert

+1

'直行'比遍历副本更有意义,因为考虑到副本的元素无论如何都被完全忽略。只是弹出,直到没有任何东西离开。 – user2357112

1

在Python中你可以使用步骤迭代扭转字符串

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

将扭转串

1

还有就是要扭转一个简单的方法:

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

您可以在另一个列表中使用循环从列表的最后一个指数为零索引,然后append然后join得到扭转特林。

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?'))