编写与reverse()函数类似的Python代码

Spi*_*uce 0 python reverse list python-3.x

我正在寻找分解reverse()函数并将其写在代码中以供练习。我最终弄清楚了如何做到这一点(向后逐步浏览原始列表并附加到新的“反向”列表),但想知道为什么这不起作用。

def reverse(list):
    newlist = []
    index = 0
    while index < len(list):
        newlist[index] = list[(len(list)) - 1 - index]
        index = index + 1
    return newlist

list = [1, 2, 3, 4, 5]
print(reverse(list))
Run Code Online (Sandbox Code Playgroud)

the*_*eye 5

在 Python 中,如果索引不在 0 和列表长度 - 1 的范围内,则无法访问/更新列表的元素。

在您的情况下,您尝试分配给 0 处的元素,但列表为空。所以,它没有索引 0。这就是它失败并出现错误的原因,

IndexError:列表分配索引超出范围

相反,您可以使用append函数,如下所示

    newlist.append(list[(len(list)) - 1 - index])
Run Code Online (Sandbox Code Playgroud)

除此之外,您可以使用range函数像这样向后计数

for index in range(len(list) - 1, -1, -1):
    newlist.append(list[index])
Run Code Online (Sandbox Code Playgroud)

你甚至不必index自己增加,for循环会处理它。


正如@abarnert所建议的,您实际上可以迭代列表并每次在开头添加元素,如下所示

>>> def reverse(mylist):
...     result = []
...     for item in mylist:
...         result.insert(0, item)
...     return result
... 
>>> reverse([1, 2, 3, 4, 5])
[5, 4, 3, 2, 1]
Run Code Online (Sandbox Code Playgroud)

如果你想创建一个新的反向列表,你可能不必自己编写函数,而是可以使用切片符号来创建一个新的反向列表,就像这样

>>> mylist = [1, 2, 3, 4, 5]
>>> mylist[::-1]
[5, 4, 3, 2, 1]
Run Code Online (Sandbox Code Playgroud)

但这并没有改变原来的对象。

>>> mylist = [1, 2, 3, 4, 5]
>>> mylist[::-1]
[5, 4, 3, 2, 1]
>>> mylist
[1, 2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)

如果要更改原始对象,只需将切片分配回原始对象的切片即可,如下所示

>>> mylist
[1, 2, 3, 4, 5]
>>> mylist[:] = mylist[::-1]
>>> mylist
[5, 4, 3, 2, 1]
Run Code Online (Sandbox Code Playgroud)

注意: reversed实际上返回一个反向迭代器对象,而不是一个列表。因此,它不会反向构建整个列表。相反,当使用协议进行迭代时,它会一一返回元素next

>>> reversed([1, 2, 3, 4, 5])
<list_reverseiterator object at 0x7fdc118ba978>
>>> for item in reversed([1, 2, 3, 4, 5]):
...     print(item)
...     
... 
5
4
3
2
1
Run Code Online (Sandbox Code Playgroud)

所以,你可能想让它成为一个生成器函数,就像这样

>>> def reverse(mylist):
...     for index in range(len(mylist) - 1, -1, -1):
...         yield mylist[index]
...     
... 
>>> reverse([1, 2, 3, 4, 5])
<generator object reverse at 0x7fdc118f99d8>
Run Code Online (Sandbox Code Playgroud)

所以该reverse函数返回一个生成器对象。如果你想要一个列表,那么你可以创建一个带有list函数的列表,就像这样

>>> list(reverse([1, 2, 3, 4, 5]))
[5, 4, 3, 2, 1]
Run Code Online (Sandbox Code Playgroud)

如果你只是要一项一项地处理它,那么用循环迭代它for,就像这样

>>> for i in reverse([1, 2, 3, 4, 5]):
...     print(i)
...     
... 
5
4
3
2
1
Run Code Online (Sandbox Code Playgroud)