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项)。:)<代码>而直接
比在副本上迭代更有意义,因为副本的元素无论如何都会被完全忽略。只要弹到什么都没剩。