[英]Python Quicksort Runtime Error: Maximum Recursion Depth Exceeded in cmp
我正在編寫一個程序,它將讀取包含5,163個名稱的文本文件。 (文字文件可以在這里看到)
然后我想將名稱存儲到名為“names”的列表中,之后,我根據名稱包含的字母數量對列表進行排序,較短的名稱位於列表的開頭,較長的名稱位於結尾。
我使用quicksort對列表進行排序,但是當我運行它時,它會顯示以下錯誤:
C:\Python27\python.exe C:/Users/Lenovo/Desktop/Anagrams/Main.py
Traceback (most recent call last):
File "C:/Users/Lenovo/Desktop/Anagrams/Main.py", line 25, in <module>
names = quicksort(names)
File "C:/Users/Lenovo/Desktop/Anagrams/Main.py", line 8, in quicksort
greater = quicksort([x for x in list[1:] if not lessThan(x, pivot)])
File "C:/Users/Lenovo/Desktop/Anagrams/Main.py", line 7, in quicksort
lesser = quicksort([x for x in list[1:] if lessThan(x, pivot)])
File "C:/Users/Lenovo/Desktop/Anagrams/Main.py", line 8, in quicksort
greater = quicksort([x for x in list[1:] if not lessThan(x, pivot)])
File "C:/Users/Lenovo/Desktop/Anagrams/Main.py", line 7, in quicksort
lesser = quicksort([x for x in list[1:] if lessThan(x, pivot)])
# [.... many lines elided ...]
File "C:/Users/Lenovo/Desktop/Anagrams/Main.py", line 8, in quicksort
greater = quicksort([x for x in list[1:] if not lessThan(x, pivot)])
File "C:/Users/Lenovo/Desktop/Anagrams/Main.py", line 8, in quicksort
greater = quicksort([x for x in list[1:] if not lessThan(x, pivot)])
File "C:/Users/Lenovo/Desktop/Anagrams/Main.py", line 7, in quicksort
lesser = quicksort([x for x in list[1:] if lessThan(x, pivot)])
File "C:/Users/Lenovo/Desktop/Anagrams/Main.py", line 3, in quicksort
if list == []:
RuntimeError: maximum recursion depth exceeded in cmp
完整的追溯作為一個牧場 。
我已經測試了quicksort函數,它適用於普通列表(例如:list = ['Alice','Bob,'Carl','Derp']),但如果我嘗試排序'名字',它就不起作用
這是我的代碼
def quicksort(list):
"""Quicksort using list comprehensions"""
if list == []:
return []
else:
pivot = list[0]
lesser = quicksort([x for x in list[1:] if lessThan(x, pivot)])
greater = quicksort([x for x in list[1:] if not lessThan(x, pivot)])
return lesser + [pivot] + greater
def lessThan(a, b):
return len(a) < len(b)
#'''
input = open('Names.txt', 'r')
output = open('Names Arranged By Length.txt', 'w')
names = []
for line in input:
line = line.translate(None, '\n')
names.append(line)
names = quicksort(names)
for i in names:
print i
output.write(i)
output.write('\n')
print 'Count: ', len(names)
input.close()
output.close()
#'''
我的代碼有什么問題,我該如何解決?
你只需要達到遞歸限制。 您的名稱列表對於Python的有限遞歸功能來說太大了。 你的Quicksort工作正常。
您可以通過使用sys.setrecursionlimit()
設置更高的限制來提高遞歸限制。 您可以將其設置得更高,但您需要自擔風險。
更好的選擇是使用內置的Python排序; TimSort算法非常優越,不會達到遞歸限制:
names = sorted(names, key=len)
這會根據長度,最短的名稱對名稱進行排序。
您超過了python默認遞歸大小。 默認遞歸限制為1000.您可以增加遞歸限制但不建議使用。 這是怎么做的
import sys
sys.setrecursionlimit(1500)
建議
我的建議是使用numpy.argsort()方法,它已經為許多排序算法做好了准備。 以下是使用numpy庫進行快速排序算法的簡單考察 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.