Python:字符串反转中途停止

Python:字符串反转中途停止,python,string,python-3.x,reverse,Python,String,Python 3.x,Reverse,我正在写一个函数来反转一个字符串,但它直到最后才完成。我是不是遗漏了什么 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?

我正在写一个函数来反转一个字符串,但它直到最后才完成。我是不是遗漏了什么

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

在python中,可以使用步骤迭代器反转字符串

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

将反转字符串

在python中,您可以使用步骤迭代器反转字符串

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

将反转字符串有一种更简单的反转方法:

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

有一种更简单的方法可以逆转:

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

问题是,从原始元素中弹出
元素,从而更改列表的长度,因此循环将在元素的一半处停止

通常通过创建临时副本来解决此问题:

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'
反向
迭代器:

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

问题是,从原始元素中弹出
元素,从而更改列表的长度,因此循环将在元素的一半处停止

通常通过创建临时副本来解决此问题:

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'
反向
迭代器:

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

您可以使用从列表的最后一个索引到零索引的循环,然后在另一个列表中使用
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?') )

您可以使用从列表的最后一个索引到零索引的循环,然后在另一个列表中使用
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?') )

感谢@JohnColeman的澄清。我只是好奇为什么这个逻辑会失败。是的,这是个坏主意;网站上的代码挑战有'str',我没有更改它hanks@JohnColeman来澄清。我只是好奇为什么这个逻辑会失败。是的,这是个坏主意;来自网站的代码挑战有'str',我没有改变它,感谢@MSeifert的详细回复。为什么循环中途停止,有什么具体原因吗?假设列表在循环之前有4个项目。在第一次迭代中,它给出第一个项目,然后您弹出一个项目(新长度=3),下一次迭代它给出第二个项目,然后弹出一个项目(新长度=2),下一次迭代循环将给出第三个项目,但因为列表只有长度2,所以现在它停止在那里。它将列表减半是因为您在每次迭代中弹出一个元素(因此每次迭代消耗2项)。:)<代码>而直接
比在副本上迭代更有意义,因为副本的元素无论如何都会被完全忽略。只要弹到什么都没剩。谢谢@MSeifert的详细回复。为什么循环中途停止,有什么具体原因吗?假设列表在循环之前有4个项目。在第一次迭代中,它给出第一个项目,然后您弹出一个项目(新长度=3),下一次迭代它给出第二个项目,然后弹出一个项目(新长度=2),下一次迭代循环将给出第三个项目,但因为列表只有长度2,所以现在它停止在那里。它将列表减半是因为您在每次迭代中弹出一个元素(因此每次迭代消耗2项)。:)<代码>而直接
比在副本上迭代更有意义,因为副本的元素无论如何都会被完全忽略。只要弹到什么都没剩。