我想创建SortedList
类的子类list
。
我希望SortedList
在实例化时进行排序。
例如,使用以下输入:
x = SortedList([1, 9, 7])
print(x)
我想要这个输出:
[1, 7, 9]
我是一个初学者。我知道可能有一些更好的功能或数据类型,但是我想练习我的dunder方法和OOP技能。
我尝试了这个,但是不起作用:
class SortedList(list):
def __init__(self, values):
super().__init__()
self.values = values
self.sort(self.values)
我有点困惑。
我以前使用过super()
,但是我将其与我制作的超类一起使用,知道了这些属性。
这一次,我必须对内置类使用super()
,所以我不确定要写什么属性。
请帮助。
谢谢!
答案 0 :(得分:3)
使用此:
class SortedList(list):
def __init__(self, values):
super().__init__(sorted(values))
x = SortedList([1, 9, 7])
print(x)
list
可以从迭代器(例如从数组)构建。因此,我们可以将值的排序副本传递给超级构造函数,并让它初始化其属性(我们不必知道list
的内部信息。)
请注意,如果您确实要实现SortedList,则必须继续重写其他方法!
答案 1 :(得分:2)
您的代码将出现错误:TypeError: sort() takes no positional arguments
。
self.sort
有问题,排序属于list
,而不是list
或SortedList
的实例,这里的self
是SortedList
的实例。因此,可以使用list.sort(self.values)
或self.values.sort()
代替self.sort(self.values)
。
更新:使用a = [1, 2, 3]
,a.sort() equals to list.sort(a)
更清晰。 sort
实际上不属于列表的实例。
对不起,我英语不好。我觉得我说得不太好...
再次更新:是的,我可以使用代码显示信息:
In [18]: a = [1, 2, 3]
In [19]: a.sort
Out[19]: <function list.sort(*, key=None, reverse=False)>
# but
In [20]: a.sort is list.sort
Out[20]: False
# I think python makes some trick here...
# so...
In [21]: list.sort
Out[21]: <method 'sort' of 'list' objects>
无论如何,我希望您能用我的表达不太充分的解释来理解为什么self.sort(self.values)
无法正常工作。
似乎我忘了显示可以工作的代码...
根据我的解释:
class SortedList(list):
def __init__(self, values):
super().__init__(values)
super().sort()
x = SortedList([1, 3, 2])
print(x)