Chciałbym scalić komórki na liście 2D, nowe wiersze są połączone w następnym pustym rzędzie. walcząc z logiką, aby to zaprojektować. Partnowałem tabelę HTML i obróciłem go na 2 wymiarową listę i chcesz połączyć rzędy, które oddzielone puste rzędy. na przykład.

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

Wyniki powinny być:

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

To moja funkcja i przyklejam postępy.

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

Z góry dziękuję za pomoc.

0
rescot 27 wrzesień 2017, 11:31

2 odpowiedzi

Najlepsza odpowiedź

Zakładając, że pracujesz z ciągami, użyj itertools.groupby i 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']]
1
juanpa.arrivillaga 27 wrzesień 2017, 08:41

Możesz utworzyć rozumienie listy przy użyciu zip i itertools.groupby, aby osiągnąć to jako:

>>> 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']]

Gdzie data zmienna trzyma wartość:

data = [['a', 'b', 'c'],
       ['d', 'e', 'f'],
       ['','','']
       ['q', 'r', 's'],
       ['t', 'u', 'v'],
       ['m', 'n', 'o'],
       ['','',''],
       ['g', 'h', 'i'],
       ['j', 'k', 'l']]
0
Anonymous 27 wrzesień 2017, 08:40