2012-06-11 7 views
0

J'ai une liste d'actions à partir d'une base de données. Ceci est copié dans une deque puisque je veux le traiter dans l'ordre, en sautant des choses sur la gauche comme je vais. J'ai donc quelque chose comme actions = deque (actions) ce qui est bien. Chaque action est une liste du module psycopg utilisant le DictCursor. Chaque liste a l'élément 'phase'.python deque/list filtering

Alors les choses vont en phases. Certaines actions sont en phase 'a', certaines en phase 'b', etc. Ce n'est pas la meilleure façon de stocker les données mais c'est ce qui m'a été donné. Donc, pour faciliter ma vie, je veux diviser la deque en plusieurs deques par phase.

Donc, si des actions [0] [ 'étape'] == 'a' alors cela va dans une liste ne contenant que des éléments de la phase un, et ainsi de suite avec, b, etc.

je pouvais faire avec un tas de ifs et d'ajout, mais cela semble être beaucoup d'efforts. Je pense que la réponse pourrait être filter(), mais je ne sais pas trop comment l'utiliser.

choses au hasard à noter:

  • Chaque élément est en ordre, l'ordre doit préserver au sein de chaque deque.
  • Les phases sont connues et séquentielles. Par exemple, si la phase c n'existe pas, nous savons que la phase d n'existe pas. Il y a un nombre fini de phases, quelque chose comme 5 si je me souviens bien.

Précision tentative:

J'ai un deque, des actions. quelque chose comme:

actions = [ 
    ['phase': 'a', 'something_else': 'x'], 
    ['phase': 'a', 'something_else': 'y'], 
    ['phase': 'b', 'something_else': 'x'] 
] 

Vous voulez finir avec (quelque chose comme):

a = [ 
    ['phase': 'a', 'something_else': 'x'], 
    ['phase': 'a', 'something_else': 'y'] 
] 
b = [ 
    ['phase': 'b', 'something_else': 'x'] 
] 

Avec la quantité minimale de code, et quelque chose qui fonctionne pour un certain nombre de phases/articles dans les phases/etc.

+0

Il est difficile de dire exactement quelle est la question ici. – Hooked

+0

C'est un peu compliqué, oui, mais saisir la question n'est pas difficile après une lecture approfondie. –

+0

Je l'ai clarifié dans tous les cas avec un exemple. Mais oui, je suis terrible à expliquer les choses. –

Répondre

2

d'abord définir une touche de fonction qui renvoie la phase lorsqu'il est administré une action, par exemple,

key = lambda action: action["phase"] 

maintenant Tri key - cela ne réorganise pas l'ordre plus que nécessaire, à savoir l'ordre est conservé pour chaque phase (il est « stable ») - puis utilisez groupby de itertools comme ceci:

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))) 

Comme vous le voyez, j'ai inversé les listes. C'est ainsi que vous pouvez simplement sortir efficacement la fin des listes au lieu d'utiliser popleft sur une deque. Si vous préférez, transformez-les en deque au lieu d'inverser. Maintenant, utilisez comme ceci:

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

J'ai fini par utiliser quelque chose d'un peu plus sournois qui ne fonctionnerait qu'avec mes données, mais je pense que c'est la bonne façon, oui. –