2009-10-12 10 views
1

J'ai un tableau avec un drapeau pour chaque cas. Pour utiliser imprimer le tableau en HTML et utiliser colspan, je dois convertir ceci:Comment faire pour supprimer une liste de tuple avec python?

[{'serve': False, 'open': False}, {'serve': False, 'open': False}, {'serve': False, 'open': False}, {'serve': False, 'open': False}, {'serve': False, 'open': False}, {'serve': False, 'open': False}, {'serve': False, 'open': False}, {'serve': False, 'open': False}, {'serve': False, 'open': False}, {'serve': False, 'open': False}, {'serve': False, 'open': False}, {'serve': False, 'open': False}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': True, 'open': True}, {'serve': False, 'open': True}, {'serve': False, 'open': True}, {'serve': False, 'open': True}, {'serve': False, 'open': True}, {'serve': False, 'open': True}, {'serve': False, 'open': True}, {'serve': False, 'open': True}, {'serve': False, 'open': True}, {'serve': False, 'open': False}, {'serve': False, 'open': False}, {'serve': False, 'open': False}, {'serve': False, 'open': False}, {'serve': False, 'open': False}, {'serve': False, 'open': False}, {'serve': False, 'open': False}, {'serve': False, 'open': False}, {'serve': False, 'open': False}, {'serve': False, 'open': False}, {'serve': False, 'open': False}, {'serve': False, 'open': False}, {'serve': False, 'open': False}, {'serve': False, 'open': False}, {'serve': False, 'open': False}, {'serve': False, 'open': False}, {'serve': False, 'open': False}, {'serve': False, 'open': False}, {'serve': False, 'open': False}, {'serve': False, 'open': False}, {'serve': False, 'open': False}, {'serve': False, 'open': False}, {'serve': False, 'open': False}, {'serve': False, 'open': False}] 

Dans ce pour le drapeau d'ouverture:

[{'colspan': 12, 'open': False}, {'colspan': 60, 'open': True}, {'colspan': 24, 'open': False}] 

Et un autre pour produire le servir un. Comment puis-je le faire de la manière la plus intelligente en utilisant Python?

Je pourrais compter le cas un par un, mais cela ne semble pas être une bonne idée.

+0

Votre question n'est pas très claire. En outre, ces valeurs colspan sont *** bizarres *** – aviraldg

+0

Cette valeur colspan sont pour cet exemple simple. La valeur colspan correspond au nombre de cas contigus ayant le même indicateur. – Natim

Répondre

4
def cluster(dicts, key): 
    current_value = None 
    current_span = 0 
    result = [] 

    for d in dicts: 
     value = d[key] 
     if current_value is None: 
      current_value = value 
     elif current_value != value: 
      result.append({'colspan': current_span, key: current_value}) 
      current_value = value 
      current_span = 0 
     current_span += 1 

    result.append({'colspan': current_span, key: current_value}) 
    return result 

by_open = cluster(data, 'open') 
by_serve = cluster(data, 'serve') 

La deuxième version, inspirée par Denis réponse et son utilisation de itertools.groupby:

import itertools 
import operator 

def make_spans(data, key): 
    groups = itertools.groupby(data, operator.itemgetter(key)) 
    return [{'colspan': len(list(items)), key: value} for value, items in groups] 
+0

Le colspan devrait redémarrer à chaque fois. Cette fonction me donne [{'colspan': 12, 'ouvert': Faux}, {'colspan': 72, 'ouvert': Vrai}, {'colspan': 96, 'ouvert': Faux}] – Natim

+0

Il y avait une ligne manquante dans mon code que j'ai corrigée il y a quelques minutes ('current_span = 0'). Cela devrait fonctionner comme prévu maintenant. Excusez ma question, mais vous savez programmer, n'est-ce pas? Je veux dire, le code est juste un exemple pour vous aider à démarrer, pas un code prêt pour la production. Si vous comprenez ce que le code fait, repérer l'erreur que vous avez décrite aurait dû être assez facile! –

+0

Oui, je l'ai corrigé moi aussi :) – Natim

4

Ce ne voit pas clairement ce que vous avez besoin, mais j'espère que les exemples suivants vous aideront:

>>> groupped = itertools.groupby(your_list, operator.itemgetter('open')) 
>>> [{'colspan': len(list(group)), 'open': open} for open, group in groupped] 
[{'colspan': 12, 'open': False}, {'colspan': 60, 'open': True}, {'colspan': 78, 'open': False}] 
>>> groupped = itertools.groupby(your_list) 
>>> [dict(d, colspan=len(list(group))) for d, group in groupped] 
[{'serve': False, 'open': False, 'colspan': 12}, {'serve': True, 'open': True, 'colspan': 52}, {'serve': False, 'open': True, 'colspan': 8}, {'serve': False, 'open': False, 'colspan': 78}] 
+0

Je ne sais pas pourquoi le dernier colspan n'a pas la valeur attendue. – Natim

+0

Ok, sais que je sais ... Mon échantillon obtient 150 cases au lieu de 96 ... Python est si puissant quand vous savez comment l'utiliser. Je vous remercie. – Natim

+2

+1 Piles incluses! Utiliser 'itertools.groupby' est le chemin à parcourir! –