2012-06-11 2 views
0

У меня есть список действий из базы данных. Это скопировано в deque, так как я хочу с этим справиться, чтобы поскользнуться с левой стороны.python deque/list filtering

Итак, у меня есть что-то вроде действий = deque (действия), которые в порядке.

Каждый элемент действия представляет собой список из модуля psycopg с использованием DictCursor. Каждый список имеет этап «фаза».

Так что все идет поэтапно. Некоторые действия находятся в фазе «a», некоторые по фазе «b» и т. Д. Не лучший способ хранения данных, но это то, что мне дано.

Так что, чтобы облегчить мою жизнь, я хочу разбить деку на несколько уровней по фазе.

Так что, если действия [0] [ «фаза»] == «а», то это идет в список, содержащий только элементы из фазы а, и так далее с, б и т.д.

Я мог бы это сделать с кучей 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'] 
] 

С минимальным количеством коды, и то, что работает для любого числа фаз/элементов в фазах/и т.д..

+0

Трудно точно сказать, в чем вопрос. – Hooked

+0

Это немного запутанно, да, но схватывание вопроса не сложно после тщательного чтения. –

+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 на deque. Если вы предпочитаете, превратите их в deque, а не в обратном направлении. Теперь используйте вот так:

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

Я закончил тем, что использовал что-то немного смутное, которое будет работать только с моими данными, но я думаю, что это правильный путь, да. –