python deque / list filtering

时间:2012-06-11 13:24:28

标签: python

我有一个来自数据库的操作列表。这被复制到一个双端队列中,因为我想按顺序处理它,在我离开时弹出左边的东西。

所以我有类似于action = deque(actions)的东西,这很好。

每个操作项都是使用DictCursor的psycopg模块中的列表。每个列表都有项目“阶段”。

所以事情分阶段进行。有些行为处于阶段'a',有些处于阶段'b',等等。这不是存储数据的最佳方式,但这就是我给出的。

所以为了让我的生活更轻松,我想逐步将神秘主义者分成几个deques。

因此,如果动作[0] ['阶段'] =='a',那么这将包含一个列表,其中仅包含来自阶段a的项目,依此类推,使用,等等。

我可以通过一堆ifs和附加来做到这一点,但这看起来很费劲。我认为答案可能是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']
]

使用最少量的代码,以及适用于阶段/等任意数量的阶段/项目的内容。

2 个答案:

答案 0 :(得分:2)

首先定义一个键函数,该函数在给定动作时返回相位,例如

key = lambda action: action["phase"]

现在首先按key排序 - 这不会重新排列超过必要的顺序,即为每个阶段保留顺序(它是“stable”) - 然后使用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...

答案 1 :(得分:0)

我认为你想从itertools模块中获得groupby。

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