python deque/list过滤

2024-10-02 06:29:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据库中的操作列表。这被复制到deque中,因为我想按顺序处理它,在我走的时候从左边弹出一些东西。在

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

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

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

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

所以如果actions[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']
]

想以(类似的)结尾:

^{pr2}$

只需最少的代码,并且可以在任何数量的阶段/项目中工作/等等


Tags: 模块项目actions数据库列表顺序阶段else
2条回答

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

key = lambda action: action["phase"]

现在先按key排序,这样不会重新排列顺序,即每个阶段的顺序都是守恒的(它是“stable”),然后使用itertools中的^{},如下所示:

^{pr2}$

如你所见,我把单子倒过来了。这样你就可以高效地跳出列表的末尾,而不是在deque上使用popleft。如果你愿意的话,把它们变成deque而不是反转。现在这样使用:

for phase, actions in results:
    while actions:
        action = actions.pop()
        # etc...

我想你需要itertools模块中的groupby。在

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

相关问题 更多 >

    热门问题