2017-09-27 2 views
0

Je souhaite fusionner des cellules dans une liste 2d, les nouvelles lignes sont fusionnées sur la ligne vide suivante. luttant avec la logique pour concevoir ceci. J'ai analysé une table html et la transformer en liste à deux dimensions et voudrais fusionner des lignes séparées par des lignes vides. par ex.Lignes de fusion python sur une cellule dans une liste bidimensionnelle

data = [[a, b, c] 
[d, e, f] 
['','',''] 
[q, r, s] 
[t, u, v] 
[m, n, o] 
['','',''] 
[g, h, i] 
[j, k, l]] 

résultats devraient être:

new_data = [[ad, be,cf] 
[qtm, run, svo] 
[gj, hk, il]] 

Ceci est ma fonction et je suis stucked progresse elle.

def _merge_data_cells(table_grid): 
    header, data = table_grid 
    if header is None or data is None: 
     return 
    offset_row = True 
    while offset_row: 
     for i, row in enumerate(data): 
      if is_empty(row): 
       offset_row = False 
       break 
      for cell in row: 

    return header, data 

Merci d'avance pour l'aide.

+2

Veuillez lire [ces directives] (https://stackoverflow.com/help/how-to-ask) et nous montrer ce que vous avez essayé. Si vous montrez à la communauté que vous avez essayé quelque chose, vous êtes plus susceptible de recevoir une réponse. –

+0

Avec quoi ** travaillez-vous exactement? Cordes? –

+0

@ juanpa.arrivillaga oui je travaille avec des cordes – otje

Répondre

1

En supposant que vous travaillez avec des chaînes, utiliser itertools.groupby et any:

In [6]: data = [['a', 'b', 'c'], 
    ...: ['d', 'e', 'f'], 
    ...: ['','',''], 
    ...: ['q', 'r', 's'], 
    ...: ['t', 'u', 'v'], 
    ...: ['m', 'n', 'o'], 
    ...: ['','',''], 
    ...: ['g', 'h', 'i'], 
    ...: ['j', 'k', 'l']] 

In [7]: from itertools import groupby 

In [8]: grouped = groupby(data, any) 

In [9]: [list(map(''.join, zip(*g))) for k, g in grouped if k] 
Out[9]: [['ad', 'be', 'cf'], ['qtm', 'run', 'svo'], ['gj', 'hk', 'il']] 
+0

merci beaucoup, ça a marché !! – otje

0

Votre peut créer une compréhension de liste utilisant zip et itertools.groupby pour y parvenir comme:

>>> from itertools import groupby 

>>> [[''.join(x) for x in zip(*j)] for i, j in groupby(data, lambda x: x[0]!='') if i] 
[['ad', 'be', 'cf'], ['qtm', 'run', 'svo'], ['gj', 'hk', 'il']] 

où la variable data tient la valeur:

data = [['a', 'b', 'c'], 
     ['d', 'e', 'f'], 
     ['','',''] 
     ['q', 'r', 's'], 
     ['t', 'u', 'v'], 
     ['m', 'n', 'o'], 
     ['','',''], 
     ['g', 'h', 'i'], 
     ['j', 'k', 'l']]