使用python检查int列表是否按升序排列

时间:2016-03-02 03:07:15

标签: python list sorting

我需要找到一个函数,通过python检查列表是否按升序排列并让它返回True或False。到目前为止我所拥有的是:

def is_sorted(list_of_ints):
    lists_of_lists = int()
    if len(lists_of_ints) in [0,1]:
        return True
    if lists_[0] <= lists_of_ints[1]:
        return is_sorted(lists_of_ints[1:])
    return False

但它回来时遇到了运行时错误。谁能告诉我或至少指出我正确的方向?

3 个答案:

答案 0 :(得分:2)

您没有提供RuntimeError的详细信息,但我猜测这是由于过度递归造成的。 Python在深度递归方面很糟糕,没有尝试优化尾递归等模式,因此当您编写这样的代码时,会递归n次(其中n是原始输入的长度),它&# 39;当输入达到相当小的长度时,它会爆炸(默认情况下,最大堆栈帧深度为1000)。

你需要找到限制递归的方法(例如,执行log n递归步骤而不是n),或者执行测试命令,循环而不递归。

您发布的代码在其他方面也有误(您有lists_of_lists未使用,甚至没有listlist_使用过但从未定义过,等等,但即使你解决了这一切,递归问题也会阻止它适用于中等大小的输入。

如果目标是验证list是否完全排序,则有更好/更简单的方法。例如:

# On Py2 only, to make zip a generator so all can short-circuit on first failure
from future_builtins import zip

def is_sorted(list_of_ints):
    return all(x <= y for x, y in zip(list_of_ints, list_of_ints[1:]))

或者在CPython中将所有工作推送到C层:

from future_builtins import map # Only on Py2
from operator import le

def is_sorted(list_of_ints):
    return all(map(le, list_of_ints, list_of_ints[1:]))

显然,return list_of_ints == sorted(list_of_ints)是最简单的方法,但对于未排序的输入,它将涉及执行O(n log n)工作来执行排序;上面给出的代码最多执行O(n)次工作,并且通常远远小于未分类输入的代码,因为它可能会在第一次不匹配时发生短路。

答案 1 :(得分:0)

你的问题是一堆错误的命名。你与你使用的名称不一致,所以很多都是未定义的。我更改了在哪里使用了名称,以下是更新后的代码:

def is_sorted(list_of_ints):
    if len(list_of_ints) in [0,1]:
        return True
    if list_of_ints[0] <= list_of_ints[1]:
        return is_sorted(list_of_ints[1:])
    return False

然而,你可以更轻松地拥有一些东西。只需与排序版本进行比较:

def is_sorted(list_of_ints):
    return list_of_ints == sorted(list_of_ints)

答案 2 :(得分:0)

您的代码中存在几个重要错误:您的变量名称不一致(即您使用多个未声明的变量,我认为这些变量应该是同一个对象),并且您将“list_of_lists”变量初始化为整数。您也在不保证的情况下使用递归,这可能会导致递归深度错误。我认为后者最有可能是RuntimeError的原因,因为未声明的变量会导致NameError并且迭代整数会导致TypeError

但是,运行代码会给我几个NameErrors,修复这些代码会给我一个正确的结果 - 所以我不确定RuntimeError来自哪里。

RuntimeError是针对不属于其他特定类别的错误的通用类,但通常会有与之关联的消息。

关于递归的说明: 在Python中通常不鼓励递归,因为堆栈帧的累积具有巨大的内存负担,并且几乎总是更有效和/或更可读的方式来实现相同的任务。每次进行函数调用时,解释器都必须为它分配内存,并且调用它的函数保留在堆栈中(在内存中),直到它返回返回值。许多其他语言实现了“尾部调用优化”,(长话短说)大大减少了调用堆栈的负载 - 但是,通过深思熟虑的设计,python没有这个。 Python会限制调用堆栈的深度和允许使用的内存量,如果达到限制,则会增加RuntimeError

除非你处理一个很长的列表,深度树或一个非常昂贵的递归函数调用,否则获得递归深度RuntimeError通常意味着你的递归算法无限运行(即你永远无法达到)你的基本情况)。