反转字符串codecademy练习(python)

时间:2015-02-24 16:20:07

标签: python string reverse

我需要在不使用反向函数或[:: - 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

我收到的错误是“列表分配索引超出范围”,虽然我不确定为什么我得到这个。谢谢你的帮助。

2 个答案:

答案 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']

现在让我们在新列表中按每个元素迭代,popappend

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'