Seite 1 von 1

Loop durch Array/Grid

Verfasst: Sonntag 23. April 2017, 22:10
von BigRed
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!

Re: Loop durch Array/Grid

Verfasst: Sonntag 23. April 2017, 22:16
von bwbg
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.

Re: Loop durch Array/Grid

Verfasst: Sonntag 23. April 2017, 22:21
von 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.

Re: Loop durch Array/Grid

Verfasst: Sonntag 23. April 2017, 22:32
von Alfons Mittelmeyer
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])

Re: Loop durch Array/Grid

Verfasst: Montag 24. April 2017, 00:47
von noisefloor
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

Re: Loop durch Array/Grid

Verfasst: Donnerstag 27. April 2017, 21:01
von BigRed
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# ;-)

Re: Loop durch Array/Grid

Verfasst: Donnerstag 27. April 2017, 21:10
von kbr
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.

Re: Loop durch Array/Grid

Verfasst: Donnerstag 27. April 2017, 21:21
von 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.