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)
在 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)
| 归档时间: |
|
| 查看次数: |
3372 次 |
| 最近记录: |