无法在Python中反转列表,得到"Nonetype"作为列表

20 投票
4 回答
26137 浏览
提问于 2025-04-16 16:44

我有一个 .py 文件,它的功能是接收一个列表,找到里面最小的数字,把这个数字放到一个新数组里,然后把这个最小的数字从原来的数组中删除,接着重复这个过程,直到原来的数组里没有任何东西为止:

def qSort(lsort):
    listlength = len(lsort)
    sortedlist = list()
    if listlength == 0:
        return lsort
    else:
        while listlength > 0:
            lmin = min(lsort)
            sortedlist.append(lmin)
            lsort.remove(lmin)
            listlength = len(lsort)
        return sortedlist

现在又有一个 .py 文件,它导入了 qSort,并在某个列表上运行这个函数,把结果保存到一个变量里。然后我尝试对这个列表使用 .reverse() 命令,但最后得到的却是 NoneType。我又试着用 reversed(),结果它只告诉我 "<listreverseiterator object at 0xSomeRandomHex>"

from qSort import qSort #refer to my first Pastebin

qSort = qSort([5,42,66,1,24,5234,62])
print qSort #this prints the sorted list
print type(qSort) #this prints <type 'list'>
print qSort.reverse() #this prints None
print reversed(qSort) #this prints "<listreverseiterator object at 0xSomeRandomHex>"

有没有人能解释一下,为什么我无论怎么做都无法反转这个列表呢?

4 个回答

5

reverse() 是一个用来反转列表的方法,它会直接在原来的列表上进行操作,并且返回 None,这是为了提醒你这个方法不会返回一个新的列表(具体可以参考文档中的第7条说明)。而内置的 reversed() 函数则会返回一个 迭代器 对象,你可以通过把它传给 list() 函数来把这个迭代器变成一个列表,比如这样:list(reversed(qSort))。另外,你也可以通过创建一个步长为负一的切片来实现同样的效果,这样就可以反向获取列表,比如 qSort[::-1]

顺便提一下,list 还有一个 sort() 方法(不过要小心,它也会返回 None ;-)。

13

list.reverse() 是一个方法,它会直接把列表里的元素顺序反转,而且不会返回任何东西(返回的是 None)。所以你不能这样说:


mylist = mylist.reverse()

你应该这样说:


mylist.reverse()

或者你也可以这样:


mylist = list(reversed(mylist))
44

正如jcomeau提到的,.reverse()这个函数是直接在原来的列表上进行修改的。它不会返回一个新的列表,而是直接改变了qSort的内容。

如果你想要“返回”一个反转后的列表,以便像你在例子中那样使用,可以用切片的方法,方向设为-1。

所以把print qSort.reverse()替换成print qSort[::-1]就可以了。


你应该了解切片,这个功能很有用。我在教程中没有看到有地方一次性讲解清楚切片的用法,(http://docs.python.org/tutorial/introduction.html#lists并没有涵盖所有内容),所以希望这里能给你一些示例。

切片的语法是:a[firstIndexInclusive:endIndexExclusive:Step]

>>> a = range(20)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> a[7:] #seventh term and forward
[7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> a[:11] #everything before the 11th term
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> a[::2] # even indexed terms.  0th, 2nd, etc
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
>>> a[4:17]
[4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
>>> a[4:17:2]
[4, 6, 8, 10, 12, 14, 16]
>>> a[::-1]
[19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> a[19:4:-5]
[19, 14, 9]
>>> a[1:4] = [100, 200, 300] #you can assign to slices too
>>> a
[0, 100, 200, 300, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

撰写回答