2

Python リストでは、リストの並べ替えを実行する別の方法が 2 つあります。

  1. その.sort場でソートするメソッドを使用する
  2. sorted()新しいソート済みリストを返す組み込み関数の使用

ここで、カスタム コンテナ タイプを作成した場合 (たとえば、itertoolsの ABC からサブクラス化することによって)、同じことができますか?

カスタム コンテナ オブジェクトを所定の位置に並べ替える方法を理解できます。しかし、私が望むのは、ビルトインsort()がカスタム コンテナ オブジェクトを使用するときに (リストではなく) そのカスタム コンテナ オブジェクトの新しいインスタンスを返すことです。

これは可能ですか?もしそうなら、どのように?

4

2 に答える 2

1

sorted()(あなたのタイプで)ソートされたコンテナではなく、リストを作成します:

class YourClass(...):
   ...
   def sort(self):
       new_data = self._data[:]
       ...sort new_data...
       return self.__class__(new_data) # new instance with sorted data
   ...
于 2012-06-07T07:55:28.403 に答える
1

builtin をサブクラス化し、methodlistを再定義するだけではどうですか?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)

親から継承されたsortメソッドはそのまま (そのまま) 残り、新しいsort_copyメソッドは新しいメソッドを作成します。

于 2012-06-07T08:03:32.990 に答える