簡體   English   中英

python deque / list filtering

[英]python deque/list filtering

我有一個數據庫中的操作列表。 這被復制到一個雙端隊列中,因為我想按順序處理它,然后在我離開時彈出左邊的東西。

所以我有類似actions = deque(actions)的東西,這很好。

每個操作項都是使用DictCursor的psycopg模塊中的列表。 每個列表都有項目“階段”。

事情分階段進行。 有些動作是階段'a',有些是階段'b',等等。不是存儲數據的最好方法,但這就是我給出的。

因此,為了讓我的生活變得更輕松,我希望通過階段將deque分成幾個deques。

因此,如果actions [0] ['phase'] =='a',那么這將進入僅包含a階段的項目的列表,依此類推,b,等等。

我可以用一堆ifs和附加來做到這一點,但這看起來很費勁。 我認為答案可能是filter(),但我不太確定如何使用它。

隨機的注意事項:

  • 每個項目都是有序的,訂單需要保留在每個雙端隊列中。
  • 階段是已知的和順序的。 例如,如果階段c不存在,我們就知道階段d不存在。 如果我記得的話,階段數量有限,就像5階段一樣。

澄清嘗試:

我有一個雙胞胎,行動。 就像是:

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']
]

使用最少量的代碼,以及適用於階段/等的任意數量的階段/項目的東西。

首先定義一個鍵函數,該函數在給定動作時返回相位,例如

key = lambda action: action["phase"]

現在首先key排序 - 這不會重新排列超過必要的順序,即為每個階段保留順序(它是“ 穩定的 ”) - 然后使用來自itertools groupby ,如下所示:

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...

我想你想從itertools模塊中獲取groupby。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM