最新の可変要素のソートされたリストにしてください

イアーゴー-リト:

私が使用することができますsortedlist.sort前にソートされなかったリストをソートするのpythonインチ

私はそれに要素を追加すると私のリストがソートされたままにしたい場合は、私が使用することができますSortedListから、sortedcontainersモジュール。

しかし、私は何のためにすぐに使用できる方法を見つける保つ要素がその中に変異すると、このリストは並べ替えません。

from sortedcontainers import SortedList

a = SortedList([], key=len) # sort elements by their length.
a.add([3,3,3]) # add in..
a.add([1]) # .. random..
a.add([2,2]) # .. order.
print(a) # [[1], [2, 2], [3, 3, 3]] still sorted, okay.

# Now, mutate one element.
a[0].append(1)
a[0].append(1)
print(a) # [[1, 1, 1], [2, 2], [3, 3, 3]] not sorted, not okay.

私はそれが理解しSortedList、それは項目が含まれていた変更を追跡し、最新に並べ替え維持する責任を負いません。

どのように私はその後、ソートを更新していますか?
私はに送信できるメッセージがあるa、私がされたインデックスの変更を行ったことを知っているので0、それは項目の場所を再考する0ように、a.update_sorting_of(0)
この専用の別のデータ構造はありますか?
私はそれを書いて、それを自分自身を最適化すべきか?
私は周りのそれと動作するはずa.add(a.pop(0))代わりに?
どのようにこの問題を回避するには、専用のソリューションと比較するのでしょうか?

私は安全に変異があることを前提とすることができますa[0]任意の私の場合は他の要素の変化(または他の私がちょうどだろうトリガされていないa.sort(key=len)全体の事を)。

Reti43:

あなたがやりたいことにするメカニズムはありません。あなたは要素を変異した後、リストを訴えるしていたとしても、それはO(nlogn)の複雑さを持っていると思います。ので、しかし、add()用途が舞台裏で二分し、それが唯一持っているO(LOGN)。それはあなたがすなわち、提案のような何かをするより良いですので、-する変異要素を削除し、それを再度追加。そして、あなたは、私は、ソート順序変更された可能性がある要素を配置するために二分より良い方法を考えることはできませんので、それはおそらく、舞台裏似た何かをしたい望んでいた機能があった場合。

def mutate_element(sortedlist, index, value):
    temp = sortedlist.pop(index)
    temp.append(value)
    sortedlist.add(temp)

あなたはさらに、様々なリスト-変異メソッドの機能を一般化できます。例えば、getattr(mylist, 'append')同じですmylist.append

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=351479&siteId=1