verzweigtes Dictionary in for Schleife?

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
ilonar
User
Beiträge: 13
Registriert: Donnerstag 13. Dezember 2018, 14:05

Halloo,

wahrscheinlich ist die Antwort ganz einfach, aber ich komm irgendwie nicht richtig drauf.

Ich habe folgende Dictionary Struktur:

Code: Alles auswählen

Materials = {
	"Rubber" : { "EModul" : "100", "Poissonzahl" : "0.49", "YieldStress" : "100000.0"},
	"Steel" : {  "EModul" : "215000.0", "Poissonzahl" : "0.28", "YieldStress" : "355.0"}
	}
und möchte nun nicht für jedes Material eine eigene Schleife basteln, sondern, dass mein Python Skript jedes Dictionary in Materials in einer for Schleife öffnet. Mein Ansatz sieht bisher so aus:

Code: Alles auswählen

for value in Materials.values():
	for line in lines:
		if "ELASTIC PLACEHOLDER" in line:
			line = Materials[str(value)]["EModul"] + ", " + Materials[str(value)]["Poissonzahl"] +"\n"			
also er soll für jedes Material EModul, Poissonzahl in einer Zeile ersetzen. Bisher spuckt er mir nur ständig Fehlermeldungen aus..

Vielleicht kann mir ja jemand helfen :)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn du nur ueber die Werte eines Worterbuches iterierst, dann ist value doch ein WERT. Und kein Schluessel, mit dem du dann wiederum auf dein Woerterbuch zugreifen kannst. Was du aber ja eh nicht musst, denn value ist doch schon der Wert. Da musst du doch dann ueberhaupt nicht mehr auf Materials selbst zugreifen.

Und woher kommt denn "lines"? Sehe ich nirgendwo definiert.
Benutzeravatar
__blackjack__
User
Beiträge: 14036
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@ilonar: Was für Fehlermeldungen denn?
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Benutzeravatar
ThomasL
User
Beiträge: 1378
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

schau dir das mal an...

Code: Alles auswählen

materials = {
	"Rubber" : { "EModul" : "100", "Poissonzahl" : "0.49", "YieldStress" : "100000.0"},
	"Steel" : {  "EModul" : "215000.0", "Poissonzahl" : "0.28", "YieldStress" : "355.0"}
	}

for key1, value1 in materials.items():
    for key2, value2 in value1.items():
        print(key2, value2)
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Sirius3
User
Beiträge: 18268
Registriert: Sonntag 21. Oktober 2012, 17:20

Hast Du Dir schonmal angeschaut was `str(values)` ist? Jedenfalls kein Schlüssel des Wörterbuchs Materials.
Das könnte besser so aussehen:

Code: Alles auswählen

for value in Materials.values():
    for line in lines:
        if "ELASTIC PLACEHOLDER" in line:
            line = "{}, {}\n".format(value["EModul"], value["Poissonzahl"])

Jetzt muß man nur noch was mit `line` machen, denn so wird das ja durch den nächsten for-Durchgang überschrieben.
Einrücken tut man übrigens mit 4 Leerzeichen pro Ebene, nicht Tabs.
ilonar
User
Beiträge: 13
Registriert: Donnerstag 13. Dezember 2018, 14:05

Sirius3 hat geschrieben: Mittwoch 19. Dezember 2018, 19:12 Hast Du Dir schonmal angeschaut was `str(values)` ist? Jedenfalls kein Schlüssel des Wörterbuchs Materials.
Das könnte besser so aussehen:

Code: Alles auswählen

for value in Materials.values():
    for line in lines:
        if "ELASTIC PLACEHOLDER" in line:
            line = "{}, {}\n".format(value["EModul"], value["Poissonzahl"])

Jetzt muß man nur noch was mit `line` machen, denn so wird das ja durch den nächsten for-Durchgang überschrieben.
Einrücken tut man übrigens mit 4 Leerzeichen pro Ebene, nicht Tabs.
DANKE! Das funktioniert!
Gibts jetzt noch eine Möglichkeit da eine if schleife mit einzubauen?
Also sowas in der Art:

Code: Alles auswählen

for value in Materials.values():
    for line in lines:
    	if value==Rubber:
            if "ELASTIC PLACEHOLDER" in line:
                line = "{}, {}\n".format(value["EModul"], value["Poissonzahl"])
          
nur value==Rubber funktioniert nicht, da in value nicht die Namen der Materialien gespeichert sind...
Ich steh mit dieser Schleife total auf dem Schlauch, sorry!
Wäre lieb wenn noch jemand kurz helfen könnte
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn du nicht nur die WERTE, sondern auch die SCHLUESSEL haben willst, dann musst du items verwenden, und in der for-Schleife entsprechend anpassen.

Code: Alles auswählen

for key, value in dictionary.items():
Und if-schleifen gibt es nicht... http://if-schleife.de/
Benutzeravatar
__blackjack__
User
Beiträge: 14036
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@ilonar: Wenn der Schlüssel gleich 'Rubber' sein soll, dann macht die Schleife über `Materials` doch überhaupt keinen Sinn, denn das trifft dann nur auf *ein einziges* Element zu. Da könnte man dann viel effizienter das hier für schreiben:

Code: Alles auswählen

    rubber = materials['Rubber']
    for line in lines:
        if 'ELASTIC PLACEHOLDER' in line:
            line = '{0[EModul]}, {0[Poissonzahl]}\n'.format(rubber)
            # ...
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
ilonar
User
Beiträge: 13
Registriert: Donnerstag 13. Dezember 2018, 14:05

Jap!

Ich habs, danke :)
Antworten