Seite 2 von 2

Re: dict als tabelle mit verbunden Zellen ausgeben...

Verfasst: Montag 7. Juli 2014, 09:35
von jens
Das wäre auch super. Hast du da einen Rohbau oder nutzt du ein "Framework" dafür?

Re: dict als tabelle mit verbunden Zellen ausgeben...

Verfasst: Montag 7. Juli 2014, 09:41
von BlackJack
@jens: Das hier *muss* elegent sein, denn es verwendet Rekursion. ;-) Ist aber wahrscheinlich von der Effizienz eher nicht so toll:

Code: Alles auswählen

#!/usr/bin/env python
from itertools import groupby
from operator import itemgetter

DATA = [
    ('SUB', 'SUBA', '0x80'),
    ('SUB', 'SUBA', '0x90'),
    ('SUB', 'SUBA', '0xa0'),
    ('SUB', 'SUBA', '0xb0'),
    ('SUB', 'SUBB', '0xc0'),
    ('SUB', 'SUBB', '0xd0'),
    ('SUB', 'SUBB', '0xe0'),
    ('SUB', 'SUBB', '0xf0'),
    ('SUB', 'SUBD', '0x83'),
    ('SUB', 'SUBD', '0x93'),
    ('SUB', 'SUBD', '0xa3'),
    ('SUB', 'SUBD', '0xb3'),
    ('ADD', 'ADDA', '0x00'),
    ('ADD', 'ADDA', '0x01'),
]


get_first = itemgetter(0)


def grouping(data):
    if data[0]:
        for key, group in groupby(data, get_first):
            new_data = [row[1:] for row in group]
            yield key, len(new_data), grouping(new_data)


def create_rows(grouped_data, columns=()):
    for block in grouped_data:
        cell, row_count, next_column = block
        for column in create_rows(next_column):
            yield columns + ((cell, row_count),) + column
            cell, row_count = None, 0
    yield ()


def create_table_rows(rows):
    for row in rows:
        if row and row[-1][-1]:
            print '<tr>'
            for value, row_count in row:
                if row_count:
                    print '  <td rowspan="{0}">{1}</td>'.format(
                        row_count, value
                    )
            print '</tr>'


def main():
    grouped = list(grouping(DATA))
    row_data = list(create_rows(grouped))
    create_table_rows(row_data)


if __name__ == '__main__':
    main()

Re: dict als tabelle mit verbunden Zellen ausgeben...

Verfasst: Montag 7. Juli 2014, 13:15
von jerch
jens hat geschrieben:Das wäre auch super. Hast du da einen Rohbau oder nutzt du ein "Framework" dafür?
Weder noch. Ich bin da Fan von "ein Dokument", das erleichtert die Weitergabe deutlich und ist für simple Sachen wie Tabellenmanipulation völlig ausreichend. Als Rohbau wäre vllt. die Grundstruktur zu sehen:

Code: Alles auswählen

<html>
<head>
<title>...</title>
<style>
...
</style>
<!-- falls 2 Dokumente kein Problem sind -->
<script type="text/javascript" src="./data.js"></script>
<body>
<!-- hier Grundgerüst für Präsi -->

<script type="text/javascript">
// selbstgebauter minimaler Knotenselektor, braucht man immer ;)
function $(id) {
    return document.getElementById(id);
}

// andere Helferlein wie Eventhandler etc.
...

// hier passiert die Magie, z.B. Tabelle füllen, sortieren, Ein-/Ausblenden etc.
// geht wunderbar mit $('wotever').innerHTML
function work_with_data(data) {
    ....
}

// hier kommen die Daten rein, wahlweise auch oben im Header
var data = ...;

work_with_data(data);
</script>
</body>
</html>
Falls Du komplexere Dinge machen willst, kannst Du das jederzeit um die üblichen verdächtigen JS-Libs (JQuery, SVG-Tools etc.) erweitern und dann eben den gesamten Ordner weitergeben. (Oder im Ein-Dokumentenfall die Libs entsprechend einbetten.)