dict als tabelle mit verbunden Zellen ausgeben...

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ich habe Daten die in einem verschachtelten dict vorliegen. Hier: https://github.com/jedie/DragonPy/blob/ ... L122-L2042

Daraus erzeuge ich auch eine csv: https://github.com/jedie/DragonPy/blob/ ... a_raw2.csv

Daraus wiederum habe ich eine Tabelle gemacht, hier: https://docs.google.com/spreadsheet/ccc ... tSFE#gid=1

Wie man sehen kann, haben einige Zellen vertikal den selben Inhalt. Wie kann ich diesen auf einfacher Weise zusammenfassen lassen. Also "Zelle verbinden" nutzten?

Natürlich unabhängig von der google seite oder Excel, calc..

Beim csv export kann man IMHO keine Meta-Daten wie "Verbundene Zellen" angeben, oder?

Welchen export könnte man also machen damit man "Verbundene Zellen" erzeugen kann?

HTML-Tabelle, xls erzeugen?

Sehe gerade, das XlsxWriter das können soll. HTML-Tabelle generieren wäre aber ehr mein Ding.

Ideen?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Was ist denn das Ziel? Soll das eine Datenstruktur zur Weiterverarbeitung sein oder eine zum Ausdrucken?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Das Ziel ist nur von den Daten eine übersichtlichere Tabelle zu erhalten. Ähnlich wie diese hier: http://koti.mbnet.fi/~atjs/mc6809/Information/6809.htm

EDIT: Ob nun in Excel/Calc oder google Tabellen, egal. Wobei mir halt einfaches HTML erst mal am besten erscheint.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Dann würde ich HTML passend finden. Ließe sich - je nach Wunsch - per CSS noch grafisch anpassen und kann aber durchaus auch noch maschinell weiterverarbeitet werden.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Per CSS? Wie soll das gehen?

Könnte mir höchstens eine JS Lösung vorstellen. Wäre auch nett. Mal suchen...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Du hast den Hinweis von Hyperion glaube ich falsch verstanden. Du erstellst die Tabelle mit HTML und wenn du diese ausdrucken oder anzeigen möchtest, dann kannst du den Style der Tabelle/Zeilen/Spalten/Zellen mit CSS anpassen.
Das Leben ist wie ein Tennisball.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@EyDu: Jo, genau so war es gemeint! :-)

Die Struktur der Tabelle wird natürlich im HTML-Code selber definiert!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Was CSS macht ist mir schon klar. Aber wie soll ich automatisiert per CSS Zellen zusammenfassen wenn der Inhalt gleich ist?

Beispiel:

Code: Alles auswählen

+-----+--...
| foo |  ...
+-----+--...
| foo |  ...
+-----+--...
|     |  ...
...
soll da zu dem werden:

Code: Alles auswählen

+-----+--...
|     |  ...
+ foo +--...
|     |  ...
+-----+--...
|     |  ...
...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

jens hat geschrieben:Was CSS macht ist mir schon klar. Aber wie soll ich automatisiert per CSS Zellen zusammenfassen wenn der Inhalt gleich ist?
Gar nicht, das musst du schon im HTML-Teil zusammengefasst haben.
Das Leben ist wie ein Tennisball.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Genau und darum dreht sich meine Eingangsfrage ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@jens: wenn Du es nur für die Anzeige brauchst, würde ich auch direkt HTML schreiben.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Jup. Aber gibt es eine modul welches den export erleichtert/automatisiert?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
BlackJack

@jens: Die üblichen Verdächtigen bei den Template-Engines. Jinja2 zum Beispiel.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Stehe wieder vor dem selben Problem und finde keine elegante Lösung.

Mal ein Konkretes Beispiel. Gegeben ist sowas:

Code: Alles auswählen

[('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')]
Raus kommen soll das:

Code: Alles auswählen

+-----+------+------+
| SUB | SUBA | 0x80 | 
|     |      | 0x90 | 
|     |      | 0xa0 | 
|     |      | 0xb0 | 
+     +------+------+
|     | SUBB | 0xc0 | 
|     |      | 0xd0 | 
|     |      | 0xe0 | 
|     |      | 0xf0 | 
+     +------+------+
|     | SUBD | 0x83 | 
|     |      | 0x93 | 
|     |      | 0xa3 | 
|     |      | 0xb3 |
+-----+------+------+

Aber halt als HTML Tabelle, also:

Code: Alles auswählen

<table>
    <tr>
        <td rowspan="12">SUB</td>
        <td rowspan="4">SUBA</td>
        <td>0x80</td>
    </tr>
    <tr>
        <td>0x90</td>
    </tr>
    <tr>
        <td>0xa0</td>
    </tr>
    <tr>
        <td>0xb0</td>
    </tr>
    <tr>
        <td rowspan="4">SUBB</td>
        <td>0xc0</td>
    </tr>
    <tr>
        <td>0xd0</td>
    </tr>
    <tr>
        <td>0xe0</td>
    </tr>
    <tr>
        <td>0xf0</td>
    </tr>
    <tr>
        <td rowspan="4">SUBD</td>
        <td>0x83</td>
    </tr>
    <tr>
        <td>0x93</td>
    </tr>
    <tr>
        <td>0xa3</td>
    </tr>
    <tr>
        <td>0xb3</td>
    </tr>
</table>

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Ich wuerde das Problem ja an prettytable weiterreichen.
BlackJack

@cofi: Soweit ich das sehe kann `prettytable` da nichts machen. `rowspan`\s kann das nicht. Und es bleibt ja immer noch das eigentliche Problem zu erkennen was zusammengefasst werden kann/muss.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

cofi hat geschrieben:Ich wuerde das Problem ja an prettytable weiterreichen.
Ja, das ist schon nett. Aber ich sehe da nichts über verbundene Zellen...

Hier meine ziemlich dumme Lösung:

Code: Alles auswählen

class Cell(object):
    def __init__(self, txt):
        self.txt = txt
        self.rowspan = 0
    def html(self):
        if self.rowspan is None:
            return ""
        elif self.rowspan == 1:
            return "<td>%s</td>" % self.txt
        return '<td rowspan="%i">%s</td>' % (self.rowspan, self.txt)

    def __str__(self):
        return "<'%s' rowspan=%s>" % (self.txt, self.rowspan)
    __repr__ = __str__


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


new_data = []
for row in data:
    new_data.append([Cell(cell) for cell in row])
data = new_data


for colum_no in xrange(len(data[0])):
    old_cell = None
    same_count = 0
    for row in reversed(data) :
        cell = row[colum_no]
        if old_cell is None:
            old_cell = cell
            same_count = 1
        elif cell.txt == old_cell.txt:
            old_cell.rowspan = None
            old_cell = cell
            same_count += 1
        else:
            old_cell.rowspan = same_count
            old_cell = cell
            same_count = 1
    old_cell.rowspan = same_count


print "<table>"
for row in data:
    print "\t<tr>"
    for cell in row:
        if cell.rowspan is not None:
            print "\t\t%s" % cell.html()
    print "\t</tr>"
print "</table>"

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Zeilen 31 bis 34 kannst du kürzer schreiben als:

Code: Alles auswählen

data = [map(Cell, row) for row in data]
Und Zeilen 43, 47 und 51 solltest du hinter den if/elif/else-Block ziehen und zusammenfassen.
Das Leben ist wie ein Tennisball.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Danke für die Anregungen... Man kann auch diese zwei Schleifen zusammen fassen, wenn es keine tuple() sind:

Code: Alles auswählen

class Cell(object):
    def __init__(self, txt):
        self.txt = txt
        self.rowspan = 0
    def html(self):
        if self.rowspan is None:
            return ""
        elif self.rowspan == 1:
            return "<td>%s</td>" % self.txt
        return '<td rowspan="%i">%s</td>' % (self.rowspan, self.txt)

    def __str__(self):
        return "<'%s' rowspan=%s>" % (self.txt, self.rowspan)
    __repr__ = __str__


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

# Wenn es doch tuple sind:
# data = [list(row) for row in data]


for colum_no in xrange(len(data[0])):
    old_cell = None
    same_count = 0
    for row in reversed(data):
        cell = row[colum_no]=Cell(row[colum_no])
        if old_cell is None:
            same_count = 1
        elif cell.txt == old_cell.txt:
            old_cell.rowspan = None
            same_count += 1
        else:
            old_cell.rowspan = same_count
            same_count = 1
        old_cell = cell
    old_cell.rowspan = same_count

print "<table>"
for row in data:
    print "\t<tr>"
    for cell in row:
        if cell.rowspan is not None:
            print "\t\t%s" % cell.html()
    print "\t</tr>"
print "</table>"
Dennoch finde ich das recht unelegant, oder?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@jens:
Eher als Anregung - ich bau mir solche "Datenblätter" lieber als eigenständiges interaktives HTML-Dokument mit der Präsentationslogik in Javascript als festgezurrt durch ein Template. Denkbar wäre z.B. Sortierung durch Klick auf Tabellenkopf, Suchfilter oder Anzeigen von zusätzlichen Inhalten bei Klick auf einen Eintrag. Falls solche Dinge wichtig sein sollten, wirds mit der pythonseitigen Aufbereitung schwierig. Da bist Du mit dem rohen Datensatz und der Bearbeitung in Javascript besser beraten.
Antworten