Listen verschachteln

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.
Antworten
djevil
User
Beiträge: 58
Registriert: Montag 22. August 2016, 14:28

Hi, ich versuche gerade ein paar Listen zu verschachteln,
(Es muss nicht unbedingt eine Liste sein)
Jedenfalls funktioniert es gerade nicht so wie gedacht, bspw.:

Code: Alles auswählen

Groups = ["Media", "Games", "Music", "Graphics", "Tools"]

Media= ["Firefox",  "Kodi" ]

        % for g in Groups:
                <h2>{{ g }}</h2>
                % for a in g:
                        <div >
                            <h2>{{ a }} </h2>
wobei mit {{ g }} die Gruppen korrekt ausgegen werden.
Und analog dazu sollte {{ a }} die Elemente von Media ausgeben, was nun nicht funktioniert, da g ein String und keine Liste mehr ist.

Wie kann ich eine derartige Ausgabe am sinnvollsten darstellen?

MFG djevil
nezzcarth
User
Beiträge: 1634
Registriert: Samstag 16. April 2011, 12:47

djevil hat geschrieben: Und analog dazu sollte {{ a }} die Elemente von Media ausgeben, was nun nicht funktioniert, da g ein String und keine Liste mehr ist.
"g" war nie eine Liste. "Media" in Zeile eins ist ein String, Media in Zeile drei ist ein Name. Die beiden sind völlig unabhängig von einander. Ich weiß nicht genau, was das Template-System, das du da verwendest im Hintergrund tut, aber in "normalem" Python gibt es keine Mechanik, die das, was du da versuchst (mit einer Zeichenkette auf ein gleichnamiges Objekt zugreifen), so erlaubt. Gibt es für "Games", "Music" etc. auch entsprechende Listen?
Dann würde vermutlich man ein Dictionary nehmen, bei dem die Schlüssel die Elemente der Liste Groups sind und die Elemente von Media etc. die Werte des jeweiligen Schlüssels.

EDIT:

In gewöhnlichem Python sähe das dann etwa so aus:

Code: Alles auswählen

groups = {'Media': ['Firefox', 'Kodi'], 'Games': ['a', 'b', 'c']}
for key, values in groups.items():
    print('Group:', key)
    for value in values:
        print(value)
djevil
User
Beiträge: 58
Registriert: Montag 22. August 2016, 14:28

Ok, ich meinte g repraesentiert die Werte der Liste Groups...
__deets__
User
Beiträge: 14535
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das gibt so keinen Sinn. Was soll denn am Ende da stehen?
djevil
User
Beiträge: 58
Registriert: Montag 22. August 2016, 14:28

Habe es jetzt so geloest, geht aber bestimmt noch schoener :)

Code: Alles auswählen

Apps = {
            "Firefox" : ["Firefox", "firefox", "/usr/bin/firefox"],
            "Kodi" : ["Kodi", "kodi", "/usr/bin/kodi"],
            "Dolphin-emu": ["Dolphin-emu", "Emu", "/usr/games/dolphin-emu"]
            }

Groups = {
    'Media': ['Firefox', 'Kodi'],
    'Games': ['Dolphin-emu', 'PCSX2', 'N64'] ,
    }

for key, values in Groups.items():
    print('Group:', key, "\n")
    for value in values:
        print(value)
        print("-------")
        for app, paths in Apps.items():
            if app == value:
                    print(*paths[1], sep="")
                    print(*paths[2], sep="")
                    print("\n")
__deets__
User
Beiträge: 14535
Registriert: Mittwoch 14. Oktober 2015, 14:29

Statt über Apps zu iterieren kannst du doch gleich drauf zugreifen.

Code: Alles auswählen

if key in dict:
     ...
Und die Liste von werten für deine Apps ist IMHO falsch. Auch das sollte ein dict sein, oder gar ein namedtuple. Denn das Index 0 dieses und Index 2 jenes ist, vergisst du spätestens in zwei Wochen. Wenn du aber Schlüssel ‚Name‘ und ‚Executable‘ hast ist das selbsterklärend.
djevil
User
Beiträge: 58
Registriert: Montag 22. August 2016, 14:28

Jetzt hab ich so:

Code: Alles auswählen

for key, values in Groups.items():
    print('Group:', key, "\n")
    for value in values:
        print('Value: ', value)
        if value in Apps[value]['name']:
            print(Apps[value]['path'])
Sieht schon besser aus :)
Antworten