我正在编写一个程序来读取包含5,163个名字的文本文件。 (文本文件可以看here)
然后我想将名称存储到名为' 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
完整的追溯功能as a pastie。
我已经测试了quicksort功能,它适用于普通列表(例如:list = [&#39; Alice&#39;,&#39; Bob,&#39; Carl&#39;,&# 39; Derp&#39;]),但如果我尝试排序&#39;
,它就不起作用这是我的代码
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()
#'''
我的代码有什么问题,我该如何解决?
答案 0 :(得分:17)
您只需点击递归限制即可。您的名称列表对于Python的有限递归功能来说太大了。你的Quicksort工作正常。
可以通过sys.setrecursionlimit()
设置更高的限制来提高递归限制。您可以将其设置得更高,但您需要自担风险。
更好的选择是使用内置的Python排序; TimSort algorithm远远优于并且不会达到递归限制:
names = sorted(names, key=len)
首先根据长度,最短名称对名称进行排序。
答案 1 :(得分:5)
超过python默认递归大小。默认递归限制为1000.您可以增加递归限制但不建议使用。这是怎么做的
import sys
sys.setrecursionlimit(1500)
<强>建议强>
我的建议是使用已经为许多排序算法准备的numpy.argsort()方法。 Here is simple examle 关于如何使用numpy库进行快速排序算法。