2016-04-11 3 views
2

Ich habe eine Liste von Listen der Form:Wie man vier Einrückungslevels in Python umgestaltet?

items = [["Wello \nWorld", "roboto.ttf", "rgb(0,0,0)"], ["StackOverflow is awesome", "roboto.ttf", "rgb(255,255,255)"]] 

Was ich tun möchte, ist über jeden list gehen ... erklären die Variablen text, font, color. Danach teilen Sie den Text in Zeilen, wenn es \n Zeichen auf ihm hat und trennen Sie dann die Zeilen in Wörter, um etwas mit ihnen zu tun.

Hier ist der Code, mit dem ich kam, um das zu erreichen.

def wrap(self, size): 
    for section in sections: 
     for text, font, color in section: 
      for line in text.splitlines(): 
       for word in line: 
        pass 

Ich weiß, dass diese Funktion falsch ist. Wenn es nicht falsch ist, dann ist die Welt falsch. Diese Ebene der Einrückung scheint hässlich und ich hoffe wirklich, dass Sie mir helfen können, es anders auszudrücken. Oder vielleicht sind die Daten falsche Struktur?

Eine weitere Sache:

Ich las von The Zen of Python, die:

Wohnung ist besser als verschachtelt.

Gilt das für meine Frage? Ich wette, es tut, aber ich habe ein wenig über Google Groups gelesen und Leute neigen dazu, beziehen sich auf Python-Pakete und Vererbungshierarchien bei der Bezugnahme auf Flat ist besser als verschachtelt.

+0

Normalerweise, wenn ich tief verschachtelte Blöcke von Code sehe, ist das erste, was zu tun ist zu sehen, ob einer dieser Blöcke zu einer separaten Funktion als logische Einheit verschoben werden kann. Ihre 'wrap()' Funktion scheint viel zu tun. Der Hauptteil der 'sections'-Schleife könnte wahrscheinlich in eine' process_section() '-Funktion verschoben werden. Ich würde darüber nachdenken, die Zeilenverarbeitung auf ihre eigene separate Funktion zu verschieben. –

+0

Die "Elemente", die Sie anzeigen, scheinen in Ihrem Code dem Abschnitt "section" zu entsprechen, sodass Ihren Beispieldaten eine Verschachtelungsebene fehlt, die von Ihrem Code widergespiegelt wird. Ihre Zeichenfolgen sind auch nur codierte Listen von Zeichenfolgen, die für die andere zusätzliche Ebene verantwortlich sind. Ihr Code wird so verschachtelt wie die Daten, die Sie analysieren möchten. – chepner

Antwort

3

"Flach ist besser als verschachtelt" bezieht sich auf das einfache Beibehalten Ihrer Datenstrukturen und die Vermeidung der Verschachtelung zu vieler Objekte in einem anderen. In Ihrem Fall haben Sie eine Liste von Listen, das sind also nur zwei Ebenen, die nicht zu schlecht sind. Und tatsächlich, Sie haben eine Liste von Drei-Tupeln (ja, das "Tupel" ist eine Liste, aber es ist immer noch eine feste Größe), also ist es überhaupt nicht problematisch.

Und da Sie nur eine Ebene haben, brauchen Sie nur eine einzige for-Schleife, um auf dieses Tupel zuzugreifen. Und dann können Sie das Tupel auszupacken, um diese Elemente und weiterverarbeiten Zugriff der text:

for section in items: 
    text, font, color = section 
    text = text.splitlines() 
    print(text, font, color) 

Dies würde Ihnen:

['Wello ', 'World'] roboto.ttf rgb(0,0,0) 
['StackOverflow is awesome'] roboto.ttf rgb(255,255,255) 

Je nachdem, was Sie wollen weiter mit diesen Werten zu tun, können Sie Ich brauche noch eine weitere Verschachtelung, um die Zeilen deines Textes zu durchlaufen, aber das ist kein Problem, also kannst du das machen.

Verwandte Themen