我需要在不使用反向函数或[:: - 1]的情况下反转字符串。
到目前为止我的代码是:
def reverse(text):
if len(text) == 1:
return text
else:
x= []
y= ""
for i in xrange(len(text)-1, -1, -1):
x[len(text) - i] = text[i]
for i in xrange(0,len(x)):
y[i] = x[i]
return y
我收到的错误是“列表分配索引超出范围”,虽然我不确定为什么我得到这个。谢谢你的帮助。
答案 0 :(得分:1)
你的反转范围逻辑是正确的,在字符串索引的末尾开始范围并倒数到0,你只需要在列表comp中使用它并使用join:
def reverse(text):
# catch empty and strings of one char
if len(text) < 2:
return text
# start at index of last char and decrease
return "".join([text[i] for i in xrange(len(text)-1,-1,-1)])
您无法分配给字符串y[i] = x[i]
,如果您想这样做,则需要将y
设为列表并再次使用加入。
您的索引错误是因为您尝试索引并清空列表,您应该附加到x
:
for i in range(len(text)-1, -1, -1):
x.append(text[i])
这将是如何使用您自己的代码执行此操作,尽管我更喜欢使用join
:
def reverse(text):
if len(text) < 2:
return text
else:
x= []
y= ""
for i in range(len(text)-1, -1, -1):
x.append(text[i]) # append
for i in x: # iterate over x
y += i # concatenate
return y
使用join将是:
def reverse(text):
if len(text) < 2:
return text
else:
x= []
for i in range(len(text)-1, -1, -1):
x.append(text[i])
return "".join(x)
答案 1 :(得分:0)
你做了很多时髦的事情,包括尝试通过更高的索引分配到列表,并假设它将“填补空白”。
In [1]: x = []
In [2]: x[4] = 1
# what you want to happen:
# x = [None, None, None, None, 1]
# what actually happens:
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-2-a9f6d07b2ba4> in <module>()
----> 1 x[4] = 1
IndexError: list assignment index out of range
所以让我们采取不同的方法。你真正想要做的是获取字符串的每个字符并以相反的顺序放置它们。井列表具有pop
方法,用于删除和返回最后一个元素,以及添加到末尾的append
元素。这听起来是正确的。幸运的是,将字符串转换为列表也很容易!
In [3]: s = "abcd"
In [4]: list(s)
Out[4]: ['a', 'b', 'c', 'd']
现在让我们在新列表中按每个元素迭代,pop
和append
。
In [5]: def new_reverse(s):
...: in_ = list(s)
...: out = []
...: for _ in range(len(in_)):
...: ch = in_.pop()
...: out.append(s)
...: return out
...:
In [6]: new_reverse("abcd")
Out[6]: ['d','c','b','a']
现在我们将字符串转换为反向列表。这是困难的部分,因为将列表重新组合成字符串是非常基本的。 str
有一个join
方法,它接受一个iteratable并加入所有元素,str
调用它,例如。
'|'.join(['a','b','c','d']) --> 'a|b|c|d'
'/'.join(['', 'usr', 'bin']) --> '/usr/bin'
如果你使用一个空字符串''
,这应该像正常一样全部回滚。
In [12]: def new_reverse(s):
...: in_ = list(s)
...: out = []
...: for _ in range(len(in_)):
...: ch = in_.pop()
...: out.append(s)
...: return ''.join(out)
...:
In [13]: new_reverse('abcd')
Out[13]: 'dcba'