pythondeque/列表过滤

pythondeque/列表过滤,python,Python,我有一个数据库中的操作列表。这是复制到一个deque,因为我想处理它的顺序,弹出的东西离开左边我去 所以我有一些类似actions=deque(actions)的东西,这很好 每个操作项都是使用DictCursor的psycopg模块的列表。每个列表都有“阶段”项 所以事情是分阶段进行的。有些操作在“a”阶段,有些在“b”阶段,等等。这不是存储数据的最佳方式,但这就是我得到的 因此,为了让我的生活更轻松,我想分阶段将deque分成几个deque 因此,如果操作[0]['phase']='a',那

我有一个数据库中的操作列表。这是复制到一个deque,因为我想处理它的顺序,弹出的东西离开左边我去

所以我有一些类似actions=deque(actions)的东西,这很好

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

所以事情是分阶段进行的。有些操作在“a”阶段,有些在“b”阶段,等等。这不是存储数据的最佳方式,但这就是我得到的

因此,为了让我的生活更轻松,我想分阶段将deque分成几个deque

因此,如果操作[0]['phase']='a',那么这将出现在一个列表中,该列表只包含来自阶段a的项目,以此类推,还有,b等等

我可以通过一系列的如果和附加来做到这一点,但这似乎需要很大的努力。我想答案可能是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']
]
想要以(类似的)方式结束:


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

我想您需要来自itertools模块的groupby


首先定义一个键函数,在给定操作时返回阶段,例如

key = lambda action: action["phase"]
现在,首先按
键进行排序
——这不会超出需要重新排列顺序,即每个阶段的顺序都是保守的(它是“”)——然后使用from
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)))
for phase, actions in results:
    while actions:
        action = actions.pop()
        # etc...
如你所见,我已经颠倒了清单。这样,您就可以高效地弹出列表的末尾,而不是在deque上使用popleft。如果你愿意的话,把它们变成一个三角形而不是倒过来。现在请这样使用:

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)))
for phase, actions in results:
    while actions:
        action = actions.pop()
        # etc...

很难准确地说出问题所在。是的,这有点复杂,但在仔细阅读之后理解这个问题并不难。无论如何,我用一个例子来说明。但是,是的,我在解释事情方面很糟糕。我最终使用了一种更狡猾的方法,这种方法只适用于我的数据,但我认为这是正确的方法,是的。