Ich weiß leider noch nicht genau warum es funktioniert: Werte in einem Dictionary addieren

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
Fuddl
User
Beiträge: 2
Registriert: Donnerstag 30. November 2017, 11:08

Hallo,

ich schreibe gerade zur Übung an einem Pen and Paper Adventure mit dem How to be a Hero Regelwerk (vielleicht hilft es um die Situation besser zu verstehen)
Bei der Charaktererstellung muss ein Wert für Handeln im Dictionary "handeln", hier 5, zu allen Werten im Dictionary "spielerhandeln" addiert werden.
Also danach müssten die Werte für laufen und schwimmen 15 sein.
Habe es hier deutlich gekürzt, es funktioniert aber wie es soll.

Code: Alles auswählen

spieler = {"handeln":5}
spielerhandeln = {"laufen":10,"schwimmen":10}
spielerhandeln = {k:v+spieler["handeln"] for k,v in spielerhandeln.items()}
print (spielerhandeln)
Erst hatte ich es aufwändiger geschrieben und war auch ok aber eher unschön. Mir ist dann eine Zeile über den Weg gelaufen die ich anpassen konnte. Leider konnte ich in meinen Büchern noch keine Erklärung finden was ich hier genau mache.

spielerhandeln = {k:v... for k,v in spielerhandeln.items()}

Denke mal ich überschreib das key,value paar mit einem neuen key und value (oben +5), oder?

Ist das ok so zu machen oder könnts Probleme geben?

Thx
Fuddl
Sirius3
User
Beiträge: 17848
Registriert: Sonntag 21. Oktober 2012, 17:20

Du überschreibst nichts, sondern erzeugst ein neues Wörterbuch. Das nennt sich Dict-Comprehension: https://peps.python.org/pep-0274/
Ist ok so.
Benutzeravatar
__blackjack__
User
Beiträge: 13275
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Fuddl: Kleine Anmerkug zu den Namen: Die könnten und sollten wahrscheinlich alle besser gewählt werden. Wie ``{"handeln":5}`` jetzt beispielsweise einen Spieler repräsentieren soll ist mir nicht wirklich klar. Bei Spieler denke ich eher daran das der einen Namen hat, bestimmte Fähigkeiten, und so weiter.

`spielderhandeln` ist auch nicht so richtig verständlich. Wörterbücher werden oft so benannt, das aus dem Namen die Bedeutung von Schlüsseln und Werten ablesbar sind. Das ist ja eine Abbildung von Schlüsseln auf Werte, und darum ist im Englischen der Name oft nach dem Muster `key_to_value`, also beispielsweise `ability_to_points` wenn jeder Schlüssel für eine Fähigkeit steht und auf Punkte abgebildet wird.

Und diese Namen würde man dann auch in einer Schleife oder „dict comprehension“ statt (fast) nichtssagenden `k` und `v` verwenden.

Sollte das überhaupt ein Wörterbuch sein? Wenn man ein Wörterbuch mit einem festen Satz an Zeichenketten als Schlüssel hat, dann ist das eigentlich ein Objekt und würde eher in einen eigenen Datentyp gehören. Mindestens in ein `collections.namedtuple()` oder aber in eine eigene Klasse.
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
Fuddl
User
Beiträge: 2
Registriert: Donnerstag 30. November 2017, 11:08

Danke @Sirius3. Jetzt kann ich das mal nachlesen und verstehen.

@_blackjack_: Das ist nur ein vereinfachter Ausschnitt um das "Problem" zu beschreiben und dient erstmal der Charaktererstellung. Komplett sieht das schon anders und detaillierter aus.
Die Namen passen halt zum Regelwerk und dem entsprechenden Charakterbogen: Der Spieler hat in der Begabung Handeln u.a. die Fähigkeiten Laufen und Schwimmen. Wenn dann eine Würfelprobe auf z.B. Schwimmen ansteht, brauche ich nicht lange überlegen wo ich den Wert her bekomme.

Das collections-Modul werde ich mir auf jeden Fall auch mal genauer ansehen.
Antworten