0

データベースからのアクションのリストがあります。順番に処理したいので、これは deque にコピーされます。

したがって、 actions = deque(actions) のようなものがありますが、これは問題ありません。

各アクション項目は、DictCursor を使用した psycopg モジュールからのリストです。各リストには「フェーズ」という項目があります。

そのため、物事は段階的に進みます。一部のアクションはフェーズ「a」、一部はフェーズ「b」などです。データを保存する最良の方法ではありませんが、それが私に与えられたものです。

したがって、私の人生を楽にするために、両端キューをフェーズごとにいくつかの両端キューに分割したいと考えています。

したがって、actions[0]['phase'] == 'a' の場合、これはフェーズ a からの項目のみを含むリストに入り、b なども同様です。

たくさんのifと追加でこれを行うことができますが、それは大変な労力のようです. 答えはfilter()かもしれないと思いますが、使い方がよくわかりません。

注意すべきランダムなもの:

  • 各アイテムは順番に並んでおり、順番は各両端キュー内で保持する必要があります。
  • フェーズは既知であり、連続しています。たとえば、フェーズ c が存在しない場合、フェーズ d が存在しないことがわかります。フェーズの数には限りがあり、思い出すと 5 つほどです。

説明の試み:

私はdeque、アクションを持っています。何かのようなもの:

actions = [
    ['phase': 'a', 'something_else': 'x'], 
    ['phase': 'a', 'something_else': 'y'],
    ['phase': 'b', 'something_else': 'x']
]

(のようなもの)で終わりたい:

a = [
    ['phase': 'a', 'something_else': 'x'], 
    ['phase': 'a', 'something_else': 'y']
]
b = [
    ['phase': 'b', 'something_else': 'x']
]

最小限のコードで、フェーズ内の任意の数のフェーズ/アイテムで機能するものなど。

4

2 に答える 2

2

最初に、アクションが与えられたときにフェーズを返すキー関数を定義します。

key = lambda action: action["phase"]

ここで、最初に並べ替えますkey-これは必要以上に順序を並べ替えません。つまり、順序は各フェーズで保存されます(「安定」です)-次に、次のように使用groupbyします。itertools

from itertools import groupby

actions.sort(key=key)

results = []    
for phase, action_iterable in groupby(actions, key=key):
    action_list = list(action_iterable)
    action_list.reverse()
    results.append((phase, action_list)))

ご覧のとおり、リストを逆にしました。これは、両端キューでpopleftを使用する代わりに、リストの最後を効率的にポップできるようにするためです。必要に応じて、逆にするのではなく、両端キューに変換します。次のように使用します。

for phase, actions in results:
    while actions:
        action = actions.pop()
        # etc...
于 2012-06-11T13:45:17.010 に答える
0

itertools モジュールの groupby が必要だと思います。

http://docs.python.org/library/itertools.html#itertools.groupby

于 2012-06-11T13:43:33.500 に答える