我有一个来自数据库的操作列表。这被复制到一个双端队列中,因为我想按顺序处理它,在我离开时弹出左边的东西。
所以我有类似于action = deque(actions)的东西,这很好。
每个操作项都是使用DictCursor的psycopg模块中的列表。每个列表都有项目“阶段”。
所以事情分阶段进行。有些行为处于阶段'a',有些处于阶段'b',等等。这不是存储数据的最佳方式,但这就是我给出的。
所以为了让我的生活更轻松,我想逐步将神秘主义者分成几个deques。
因此,如果动作[0] ['阶段'] =='a',那么这将包含一个列表,其中仅包含来自阶段a的项目,依此类推,使用,等等。
我可以通过一堆ifs和附加来做到这一点,但这看起来很费劲。我认为答案可能是filter(),但我不太确定如何使用它。
随机注意事项:
澄清尝试:
我有一个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']
]
使用最少量的代码,以及适用于阶段/等任意数量的阶段/项目的内容。
答案 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