Loop durch Array/Grid

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
BigRed
User
Beiträge: 2
Registriert: Freitag 24. März 2017, 15:55

Hallo,

Ist sicherlich ne Anfängerfrage und ich finde zu genau DEM Thema nichts in der Suche. Iterieren wurde zwar schon besprochen natürlich, aber nicht durch ein so komsiches 2-Dimensionales Dinges.

Ich habe folgendes "Grid" erstellt:

Code: Alles auswählen

    def generate_grid_case_1(self):
        grid = {}
        grid[(1 ,1)] = self.generate_dummy_module_decorator_instance("upper_left")
        grid[(1, 2)] = self.generate_dummy_module_decorator_instance("middle_left")
        grid[(1, 3)] = self.generate_dummy_module_decorator_instance("lower_left")
        grid[(2, 1)] = self.generate_dummy_module_decorator_instance("connector")
        grid[(3, 1)] = self.generate_dummy_module_decorator_instance("endpoint")
        return grid 
In C# könnte man nun durch die "Keys" durch iterieren, und es wäre egal, was in dem Key drin steht. Bin leider noch nicht erfahren in Python und habe keine Idee, wie man hier am besten durch das "Grid" iteriert... hat jemand für mich einen Tipp? Ich brauche bei der Iteration sowohl die beiden Zahlen als auch das dahinter stehende Objekt.

Danke schon mal und Sorry für die sicherlich Anfängerfrage!
Zuletzt geändert von Anonymous am Sonntag 23. April 2017, 22:16, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Ein dict-Objekt bietet eine keys-Methode. Ansonsten probiere Python im (interaktiven) Interpreter aus. Hier lassen sich die Attribute der Objekte (zu denen ich auch gewissermaßen die Methoden zähle) recht einfach ermitteln (dir-Funktion) oder auch über die help-Funktion.
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
BlackJack

@BigRed: Die Antwort würde man nach dem durcharbeiten eines Grundlagentutorials sehr wahrscheinlich wissen. Und wenn man sucht, dann würde man sich in der Dokumentation erst einmal anschauen was Wörterbücher so an Methoden bieten. Also genau wie bei C# und anderen Programmiersprachen auch.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Wo ist da das Problem?

Code: Alles auswählen

def generate_grid_case_1():
        grid = {}
        grid[(1 ,1)] = "upper_left"
        grid[(1, 2)] = "middle_left"
        grid[(1, 3)] = "lower_left"
        grid[(2, 1)] = "connector"
        grid[(3, 1)] = "endpoint"
        return grid

grids = generate_grid_case_1()

for i in grids:
    print(i,grids[i])
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@BigRed: du hast nichts 2-Dimensionales, du hast als Datenstruktur ein Dictionary,das Tuple als Werte für die Schlüssel hat. Das Dict ist aber 1-Dimensional. Wenn du was "echtes" 2-dimensionales brauchst, dann nimm' eine Liste von Listen oder direkt ein NumPy-Array.

Und um über die Schlüssel-Werte Paare eine Dicts zu iterieren ist schöner:

Code: Alles auswählen

for key, value in my_dict.items():
    #do something here...
Gruß, noisefloor
BigRed
User
Beiträge: 2
Registriert: Freitag 24. März 2017, 15:55

Danke für die schnellen und mir sehr helfenden Antworten.

for i in grids:
print(i,grids)

Das war's - ich muss mich noch an python gewöhnen, aber ich finde es cool, wie viel weniger man schreiben muss als in C# ;-)
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

BigRed hat geschrieben:

Code: Alles auswählen

for i in grids:
    print(i,grids[i])
Hier gibt es direkt mehrere Möglichkeiten, so z.B. auch

Code: Alles auswählen

for key, value in grids.items():
    print(key, value)
Je nach Anwendungsfall kann die ein oder andere Variante eleganter sein.
BlackJack

@BigRed: Zum Erzeugen hätte man auch so etwas schreiben können:

Code: Alles auswählen

        def generate_grid_case_1(self):
            return dict(
                coordinate, self.generate_dummy_module_decorator_instance(name)
                for coordinate, name in [
                    ((1, 1), 'upper_left'),
                    ((1, 2), 'middle_left'),
                    ((1, 3), 'lower_left'),
                    ((2, 1), 'connector'),
                    ((3, 1), 'endpoint'),
                ]
            )
Oder aber mindestens ein literales Wörtebuch was gleich den Inhalt enthält, statt jeden Wert einzeln zuzuweisen.

Und ich hoffe die Klasse in der das steht macht auch Sinn und die existiert nicht nur weil Du in C# alles in Klassen stehen hast auch wenn es eigentlich nur Funktionen sind.
Antworten