python - 类中的python合并排序
问题描述
我正在尝试使用第一个代码在“python项目的排序器”类中进行合并排序。问题是,每当我初始化代码时,它都会调用错误“merge_sort'未定义”,如果我删除“merge_sort”并使用“left = lst[:mid]”,它只会将列表切成两半并重新组织,但不会用整个列表完成脚本。有没有办法解决这个问题?谢谢!
from sorter import Sorter
unsorted_list = [5, -3, 4, 10, -14, 2, 4, -5]
my_sorter = Sorter()
my_sorter.unsorted_tuple = tuple(unsorted_list)
sorted_list = my_sorter._merge_sort()
print(sorted_list)
我的代码:
class Sorter():
def __init__(self):
self.unsorted_tuple = tuple([])
self.algorithm = 'default'
def generate_new_tuple(self, n):
new_list = []
for x in range (0, n):
new_list.append(random.randint(0, maxsize))
tuple(new_list)
self.unsorted_tuple = new_list
return None
def _merge_sort(self, reverse=False):
lst = list(self.unsorted_tuple)
result = []
i,j = 0,0
if(len(lst)<= 1):
return lst
mid = int(len(lst)/2)
left = _merge_sort(lst[:mid])
right = _merge_sort(lst[mid:])
while i<len(left) and j<len(right):
if left[i] <= right[j]:
result.append(left[i])
i+=1
else:
result.append(right[j])
j+=1
result += left[i:]
result += right[j:]
return result
解决方案
您对类和方法的工作方式感到困惑。
编译器是正确的(根据定义......):没有 function _merge_sort
。该名称适用于方法,并且必须与Sorter
对象一起调用。您在设置此类时遇到了很多麻烦,但是当您尝试在列表的一半上重复时,您忽略了这些封装保护:
left = _merge_sort(lst[:mid])
right = _merge_sort(lst[mid:])
您正在尝试调用您的方法,就好像它是一个通用函数一样。相反,您必须为Sorter
列表的每一半实例化对象,将它们的未排序属性设置为这些半列表,然后您可以在每个列表上调用该方法。就像是:
left_half = Sorter()
left_half.unsorted_tuple = lst[:mid]
left = left_half._merge_sort()
right_half = Sorter()
right_half.unsorted_tuple = lst[mid:]
right = right_half._merge_sort()
请考虑此代码的“重量”;也许您可以重新配置您的课程以更好地支持您的需求。对于初学者,__init__
为列表/元组的初始值提供另一个参数。
这会让你感动吗?
推荐阅读
- ios - 在 iOS 中使用带有 SSL 固定的自签名证书
- ios - 配置文件无效会导致用户必须重新下载应用程序
- javascript - Material UI v5 服务器端渲染 css 顺序不适用于 gatsby
- java - 二维数组数学序列(Java)
- python - Python, delete attribute from instance but not from source
- python - 无法将数据磁盘附加到 Azure VM
- java - I cant connect a form with method post with a servlet
- android - Cache HTTP response or store in database in mobile apps?
- javascript - Twitter Api returns "code":215,"message":"Bad Authentication data." by axios
- python - How to play the alarm after 5 second when the eyes had closed in python?