Python快速排序运行时错误:cmp中超过最大递归深度

Python快速排序运行时错误:cmp中超过最大递归深度,python,recursion,runtime-error,quicksort,Python,Recursion,Runtime Error,Quicksort,我正在写一个程序,可以读取包含5163个名字的文本文件。(可以看到文本文件) 然后我想把名字存储到一个名为“名字”的列表中,然后,我根据名字包含的字母数对列表进行排序,短名字在列表的开头,长名字在末尾 我使用快速排序对列表进行排序,但当我运行它时,它显示以下错误: C:\Python27\python.exe C:/Users/Lenovo/Desktop/Anagrams/Main.py Traceback (most recent call last): File "C:/Users/L

我正在写一个程序,可以读取包含5163个名字的文本文件。(可以看到文本文件)

然后我想把名字存储到一个名为“名字”的列表中,然后,我根据名字包含的字母数对列表进行排序,短名字在列表的开头,长名字在末尾

我使用快速排序对列表进行排序,但当我运行它时,它显示以下错误:

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
C:\Python27\python.exe C:/Users/Lenovo/Desktop/Anagrams/Main.py
回溯(最近一次呼叫最后一次):
文件“C:/Users/Lenovo/Desktop/Anagrams/Main.py”,第25行,在
名称=快速排序(名称)
文件“C:/Users/Lenovo/Desktop/Anagrams/Main.py”,第8行,快速排序
更大=快速排序([x代表列表[1]中的x,如果不是小于(x,pivot)])
文件“C:/Users/Lenovo/Desktop/Anagrams/Main.py”,第7行,快速排序
lesser=快速排序([x代表列表[1]中的x,如果lessThan(x,pivot)])
文件“C:/Users/Lenovo/Desktop/Anagrams/Main.py”,第8行,快速排序
更大=快速排序([x代表列表[1]中的x,如果不是小于(x,pivot)])
文件“C:/Users/Lenovo/Desktop/Anagrams/Main.py”,第7行,快速排序
lesser=快速排序([x代表列表[1]中的x,如果lessThan(x,pivot)])
#[…省略了许多行…]
文件“C:/Users/Lenovo/Desktop/Anagrams/Main.py”,第8行,快速排序
更大=快速排序([x代表列表[1]中的x,如果不是小于(x,pivot)])
文件“C:/Users/Lenovo/Desktop/Anagrams/Main.py”,第8行,快速排序
更大=快速排序([x代表列表[1]中的x,如果不是小于(x,pivot)])
文件“C:/Users/Lenovo/Desktop/Anagrams/Main.py”,第7行,快速排序
lesser=快速排序([x代表列表[1]中的x,如果lessThan(x,pivot)])
文件“C:/Users/Lenovo/Desktop/Anagrams/Main.py”,第3行,快速排序
如果列表=[]:
运行时错误:cmp中超过最大递归深度
完整的回溯是可用的

我已经测试过快速排序函数,它适用于普通列表(例如:list=['Alice'、'Bob、'Carl'、'Derp')),但如果我尝试对“name”进行排序,它就不起作用了

这是我的密码

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()
#'''
def快速排序(列表):
“”“使用列表理解进行快速排序”“”
如果列表=[]:
返回[]
其他:
pivot=列表[0]
lesser=快速排序([x代表列表[1]中的x,如果lessThan(x,pivot)])
更大=快速排序([x代表列表[1]中的x,如果不是小于(x,pivot)])
返回较小值+[枢轴]+较大值
def lessThan(a,b):
返回长度(a)

我的代码出了什么问题?如何修复它?

您已经达到了递归限制。您的名称列表对于Python有限的递归功能来说太大了。否则,您的快速排序工作正常

您可以通过使用将限制设置得更高来提高递归限制。您可以将其设置为一个相当高的值,但风险由您自己承担

更好的选择是使用内置的Python排序;它的性能非常优越,不会达到递归限制:

names = sorted(names, key=len)

这将按名称的长度排序,首先是最短的名称。

超出了python默认的递归大小。默认递归限制为1000。您可以增加递归限制,但不建议这样做。下面是如何做

import sys
sys.setrecursionlimit(1500)
建议

我的建议是使用已经为许多排序算法准备好的方法。关于如何使用numpy库进行快速排序算法。

什么是
len(名称)
?@MartijnPieters是的,我知道
len(名称)
做什么!我的意思是:名单有多长?@jonrsharpe:啊,我明白你的意思;您想知道兔子洞有多深才能产生这种堆栈跟踪。jonrsharpe是正确的:您可能试图对太大的列表进行排序。设置例如
key=len
-查看什么是sane值?@dhill:默认值为sane。如果你需要提出它,仔细考虑一下这个算法,也许可以不用递归就解决它?