[英]python deque/list filtering
我有一個數據庫中的操作列表。 這被復制到一個雙端隊列中,因為我想按順序處理它,然后在我離開時彈出左邊的東西。
所以我有類似actions = deque(actions)的東西,這很好。
每個操作項都是使用DictCursor的psycopg模塊中的列表。 每個列表都有項目“階段”。
事情分階段進行。 有些動作是階段'a',有些是階段'b',等等。不是存儲數據的最好方法,但這就是我給出的。
因此,為了讓我的生活變得更輕松,我希望通過階段將deque分成幾個deques。
因此,如果actions [0] ['phase'] =='a',那么這將進入僅包含a階段的項目的列表,依此類推,b,等等。
我可以用一堆ifs和附加來做到這一點,但這看起來很費勁。 我認為答案可能是filter(),但我不太確定如何使用它。
隨機的注意事項:
澄清嘗試:
我有一個雙胞胎,行動。 就像是:
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.