1

限られた元に戻すバッファーを格納するデータ構造を構築したい、たとえば以下の疑似コードを使用して 6 dict データを格納します。

rawdict1 = {1}
buffer = [{1}]

rawdict1 = {2}
buffer = [{2}{1}]      # {1} stored on the postion

rawdict1 = {3}
buffer = [{3}{2}{1}]      
...
rawdict1 = {5}
buffer = [{5}{4}{3}{2}{1}]      # max length limited to 5

rawdict1 = {6}
buffer = [{6}{5}{4}{3}{2}]      # {1} has been deleted because exceed the limit

when I want to restore the rawdict1 later, I can use something looks like:

rawdict1 = buffer[5]                 # restore the 5th dict.

私の質問は、既存の組み込みデータ型または標準ライブラリ型をそのような目的で使用できるかということです。

そして、そのような構造が1つの構造インスタンスにマルチタイプを格納できる可能性はありますか?たとえば、dictと自己定義クラスを一度に格納したい場合は?

ありがとう!

Rg、

KC

4

5 に答える 5

2

おそらく次のようなものを使用します。

import collections

class UndoBuffer(object):
    def __init__(self,value,max_length=5):
        self.max_length=max_length
        self._buffer=collections.deque([value],max_length)
    @property
    def data(self):
        return self._buffer[-1]
    @data.setter
    def data(self,value):
        self._buffer.append(value)
    def restore(self,index):
        self.data=self._buffer[index]

UndoBuffer オブジェクトを作成する

rawdict=UndoBuffer('{1}')      

属性を設定するとdata、値が に自動的に保存されます_buffer

print(rawdict._buffer)
# deque(['{1}'], maxlen=5)
print(rawdict.data)
# {1}

の値を変更すると、値が にrawdict.data追加されますrawdict._buffer

rawdict.data = '{2}'
print(rawdict._buffer)
# deque(['{1}', '{2}'], maxlen=5)

Buf にアクセスrawdict.dataすると、最新の値が取得されます。

print(rawdict.data)
# {2}

値をさらに数回変更します。'{1}' は、バッファーが最大長に達すると削除されます:

rawdict.data = '{3}'
rawdict.data = '{4}'
rawdict.data = '{5}'
print(rawdict._buffer)
# deque(['{1}', '{2}', '{3}', '{4}', '{5}'], maxlen=5)
rawdict.data = '{6}'
print(rawdict._buffer)
# deque(['{2}', '{3}', '{4}', '{5}', '{6}'], maxlen=5)

rawdict._buffer からの値の復元:

rawdict.restore(0)   # set rawdict.data to rawdict._buffer[0]
print(rawdict.data)
# {2}
print(rawdict._buffer)
# deque(['{3}', '{4}', '{5}', '{6}', '{2}'], maxlen=5)
于 2010-08-02T02:38:52.537 に答える
1

rawdict1ベアネームへの割り当てをインターセプトして、以前の値を保存するなど、「サイド」でそれらを実行させる方法がないため、ベアネーム( など)では実行できません。装飾された名前で行うのは簡単です。

undoable.rawdict1 = {1}

など、前の値 (存在する場合) をリストに追加し、リストが長くなりすぎた場合は 0 番目の項目をポップundoableする適切なクラスのインスタンスを作成します。しかし、割り当て以外の「元に戻すことができる」アクションに__setitem__は十分ではありません。undoable.rawdict1.update(whatever)

于 2010-08-02T02:39:10.523 に答える
1

リストをすばやくサブクラス化して、限られたストレージのみを許可できます。

class LimitedStack(list):
 def __init__(self,limit=6):
    list.__init__(self)
    self.limit = limit

 def append(self,obj):
    if len(self) == self.limit:
        list.pop(self,0)
    list.append(self,obj)

Python リストは、C# の汎用リストのように特定の型である必要はありません。それらは、追加したオブジェクトを保存します。

于 2010-08-02T02:48:45.287 に答える
1

python 2.6 のコレクション モジュールには、「deque」コレクションが含まれています。必要に応じて動作します。

>>> import collections
>>> buffer = collections.deque([],6)
>>> buffer.extend(range(6))
>>> buffer
deque([0, 1, 2, 3, 4, 5], maxlen=6)
>>> buffer.append(6)
>>> buffer
deque([1, 2, 3, 4, 5, 6], maxlen=6)
>>> buffer[-1]
6
于 2010-08-02T02:56:38.663 に答える
0

Rockford Lhotka の CSLA.NET フレームワークには Undo アーキテクチャが含まれています。おそらく、あなたはそれを研究して彼が何をしたかを理解するか、箱から出して使用することさえできます.

于 2010-08-02T02:37:33.240 に答える