簡體   English   中英

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

[英]Check if int list in in ascending order with python

我需要找到一個函數來檢查列表是否通過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

但是它又返回了運行時錯誤。 誰能告訴我或至少指向我正確的方向?

您沒有提供RuntimeError的詳細信息,但是我猜想這是由於過度遞歸所致。 Python不擅長進行深度遞歸,因此沒有嘗試優化像尾遞歸這樣的模式,因此當您編寫這樣的遞歸n次(其中n是原始輸入的長度)的代碼時,當輸入達到相當小的長度(默認情況下,最大堆棧框架深度為1000)。

您需要找到限制遞歸的方法(例如,執行log n遞歸步驟而不是n ),或者強制執行測試,而無需遞歸地循環。

您發布的代碼在其他方面也是錯誤的(您有未使用的lists_of_lists ,甚至沒有使用過的listlist_但從未定義過的list_等),但是即使您修復了所有這些問題,遞歸問題也將阻止它甚至適用於中等大小的輸入。

如果目標是驗證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)工作,並且通常比未排序的輸入要少得多,因為它可能在第一次失配時短路。

您的問題是一堆錯誤的命名。 您與使用的名稱不一致,因此許多名稱未定義。 我更改了在何處使用的名稱,以下是更新的代碼:

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)

您的代碼中有幾個重大錯誤:變量名不一致(即,您使用了幾個我認為應該是同一對象的未聲明變量),並且您已將“ list_of_lists”變量初始化為整數。 您還在無法保證遞歸的情況下使用遞歸,這可能會導致遞歸深度錯誤。 我認為后者將是RuntimeError的最可能原因,因為未聲明的變量將導致NameError ,而對整數進行迭代將導致TypeError

但是,運行您的代碼會給我幾個NameErrors ,而修復它們會給我一個正確的結果-所以我不確定RuntimeError的來源。

RuntimeError是不屬於其他特定類別的錯誤的通用類,但通常會有一條消息與其關聯。

關於遞歸的注意事項:在Python中通常不鼓勵遞歸,因為堆棧幀的累積會帶來巨大的內存負擔,並且幾乎總是有更高效和/或更易讀的方式來完成同一任務。 每次進行函數調用時,解釋器都必須為其分配內存,並且調用該函數的函數會保留在堆棧中(在內存中),直到返回返回值為止。 許多其他語言都實現了“尾調用優化”,這(長話短說)極大地降低了調用堆棧上的負載-但是,經過精心設計,python沒有此功能。 Python限制了調用堆棧的深度和允許使用的內存量,如果達到限制,它將引發RuntimeError

除非您要處理很長的列表,較深的樹或非常占用空間的遞歸函數調用,否則獲取遞歸深度RuntimeError通常意味着您的遞歸算法正在無限運行(即,您永遠不會達到基本情況)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM