在 Python 列表中,有两种执行列表排序的替代方法:
- 使用它的
.sort
方法,它就地排序 - 使用
sorted()
内置函数,它返回一个新的排序列表
现在,如果我创建一个自定义容器类型(比如通过从itertools
ABC 继承),我可以这样做吗?
我可以弄清楚如何使自定义容器对象就地排序。但我想要的是内置sort()
在我使用它时返回该自定义容器对象的新实例(而不是列表)。
这可能吗?如果是这样,怎么做?
sorted()
不是排序容器(使用您的类型),而是列出:
class YourClass(...):
...
def sort(self):
new_data = self._data[:]
...sort new_data...
return self.__class__(new_data) # new instance with sorted data
...
只是继承内置函数list
,然后重新定义sort
方法呢?
>>> class MyList(list):
def sort(self):
copy = list(self)
copy.sort()
return MyList(copy)
>>> l2 = MyList([2, 6, 9, 8])
>>> l2
[2, 6, 9, 8]
>>> l3 = l2.sort()
>>> l2
[2, 6, 9, 8]
>>> l3
[2, 6, 8, 9]
>>>
编辑:在OP的评论之后,保留sort
方法并添加一个新方法:
>>> class MyList(list):
def sort_copy(self):
copy = list(self)
copy.sort()
return MyList(copy)
从 parent 继承的sort
方法保持原样(原位),新sort_copy
方法创建一个新方法。