2009-08-19 8 views
0

Dire que j'ai un ensemble de données commeConversion d'un ensemble de données imbriqué à un ensemble de données à plat, tout en conservant suffisamment de données pour la reconvertir en emboîtés mis

(1, 2, (3, 4), (5, 6), (7, 8, (9, 0))) 

Je veux le convertir en une représentation plate (semi) comme,

(
(1, 2), 
(1, 2, 3, 4), 
(1, 2, 5, 6), 
(1, 2, 7, 8), 
(1, 2, 7, 8, 9, 0), 
) 

Si vous utilisez cette option, (extrait de SO)

def flatten(iterable): 
    for i, item in enumerate(iterable): 
     if hasattr(item, '__iter__'): 
      for nested in flatten(item): 
       yield nested 
     else: 
      yield item 

cela va convertir en une liste comme (après itérer)

[1, 2, 3, 4, 5, 6, 7, 8, 9] 

Mais je ne peux pas obtenir l'original de cette reperenstation, alors que je peux récupérer l'original de la première. (Si chaque tuple dispose de 2 éléments seulement)

+1

Comment convertir cette version semi-plate à l'original? – Triptych

+0

Je pense qu'il serait plus logique de conserver votre ensemble de données hiérarchique et de créer un ensemble supplémentaire aplati. Il utilise probablement moins de mémoire que votre approche semi-aplatie, et certainement moins de temps de calcul. – txwikinger

+1

Et quelle est la question? – hirschhornsalz

Répondre

2

Cela donnera la sortie par exemple. Je ne sais pas si c'est vraiment la meilleure façon de représenter le modèle que vous voulez, cependant ...

def combineflatten(seq): 
    items= tuple(item for item in seq if not isinstance(item, tuple)) 
    yield items 
    for item in seq: 
     if isinstance(item, tuple): 
      for yielded in combineflatten(item): 
       yield items+yielded 

>>> tuple(combineflatten((1, 2, (3, 4), (5, 6), (7, 8, (9, 0))))) 
((1, 2), (1, 2, 3, 4), (1, 2, 5, 6), (1, 2, 7, 8), (1, 2, 7, 8, 9, 0)) 
0

Que diriez-vous d'utiliser une autre représentation « à plat », un qui peut être reconverti:

[1, 2, '(', 3, 4, ')', '(', 5, 6, ')', '(', 7, 8, '(', 9, 0, ')', ')'] 
Questions connexes