Anfängerproblem beim Übertragen von Elementen eines verschachtelten Dictionarys in ein anderes

Code-Stücke können hier veröffentlicht werden.
Antworten
Bondying
User
Beiträge: 3
Registriert: Freitag 18. März 2022, 12:55

Bitte um Hilfe, ich finde den Fehler nicht!

Ich verwende zum Anhängen eines Dictionary-Elements zwei Mal den gleichen Befehl. Im Programmteil der manuellen Eingabe funktioniert er, im zweiten Programmteil, wo bestimmte Einträge von einem Dict in das andere übernommen werden sollen, wird immer das zuletzt übernommene mit den neuen überschrieben und nicht das neue Element angehängt.


Hier zuerst der Quellcode mit ausführlichen Erläuterungen, darunter das Ergebnis bei der Eingabe in der Jupyter-Umgebung:

"""
Aufgabe:
Es sollen zwei geschachtelte Dictionaries erstellt mit Mitarbeiterdaten erstellt werden: mitarbeiterliste1 und mitarbeiterliste2.
zur Benutzerkennung sollen jeweils die Angaben von Vor- und Nachname sowie Geburtsjahr gespeichert werden.
Mitarbeiterliste1 ist mit zwei Standard-Benutzerkennungen angegeben. Besonderheit hier ist das leere Geburtsdatum.
Mitarbeiterliste ist mit einem Leer-Nutzer gefüllt: keine Angaben von Name oder Geburtsdatum.

Im ersten Schritt soll der User weitere Mitarbeiter eingeben, bis er die Eingabe durch "ende" im Feld userid abbricht.
Die eingegebenen Mitarbeiter werden in der mitarbeiterliste1 gespeichert.
Hierzu wird der Befehl 'mitarbeiterliste1.update(neuer_mitarbeiter)' verwendet.

Nach Eingabeende wird die mitarbeiterliste1 durchlaufen und jeder mitarbeiter angezeigt.
Hat ein Mitarbeiter ein gültiges Geburtsdatum ( größer Null ), sollen dessen Daten in die mitarbeiterliste2 aufgenommen werden.

DIESE ÜBERTRAGUNG DER MITARBEITER FUNKTIONIERT NICHT!
NACH DEM BEFEHL 'mitarbeiterliste2.update(copy_mitarbeiter)' BESTEHT DIE mitarbeiterliste2
IMMER NUR AUS DEM LEEREINTRAG PLUS DER LETZTEN AUS mitarbeiterliste1 ZU ÜBERNEHMENDEN PERSON!

Wo liegt der Fehler???
"""

# Initialisierung der Dictionaries 'mitarbeiterliste1' und 'mitarbeiterliste2'
mitarbeiterliste1 = {
"admin": {
"vorname": "level 0",
"nachname": "administrator",
"jahrgang": "0000"
},
"service": {
"vorname": "servicemitarbeiter",
"nachname": "hard- & software",
"jahrgang": "0000"
}
}
print("\nStartinhalt der Mitarbeiterliste 1 = Quellliste für den Kopiervorgang")
print(mitarbeiterliste1)
print("\n")

mitarbeiterliste2 = {
"leereintrag" : {
"vorname": "",
"nachname": "",
"jahrgang": ""
}
}
print("\nStartinhalt der Mitarbeiterliste 2 = Zielliste für den Kopiervorgang")
print(mitarbeiterliste2)
print("\n")

# ==============================================================================
# Programmteil 1: manuelle Eingabe neuer Mitarbeiter
print("\n=== Beginn der manuellen Eingabe neuer Mitarbeiter ===")
print("\tbei Eingabe von'0000' im Feld 'Geburtsjahr' wird der Mitarbeiter nicht")
print("\tspäter in die zweite Mitarbeiterliste übernommen")

abbruch = False
eingabe = "Eingabeende mit 'ende' \nuserid: "
while abbruch == False:
# EINGABE
e_userid = input(eingabe)
if e_userid == "ende":
print("\tEingabe beendet\n")
abbruch = True
break
else:
e_nachname = input("Nachname: ")
e_vorname = input("Vorname: ")
e_jahrgang = input("Geburtsjahr")
print(f"Ihre Eingaben: {e_nachname.title() + ' ' + e_vorname.title() + ' ' + e_jahrgang.title()}")

neuer_mitarbeiter = {e_userid : {
"vorname": e_vorname,
"nachname": e_nachname,
"jahrgang": e_jahrgang
}
}
print("\nMitarbeiter wird an die Mitarbeiterliste 1 angehängt")
print("neuer Stand der Mitarbeiterliste 1")
mitarbeiterliste1.update(neuer_mitarbeiter)
print(mitarbeiterliste1)
print("\n")

print("\n=== Ende der manuellen Eingabe ===")

# ============================================================================================
# Programmteil 2: Anzeige aller Personen aus mitarbeiterliste1
# und übernahme derjenigen in mitarbeiterliste2 mit jahrgang > 0
print("jetzt Ausgabe der einzelnen Personen der Mitarbeiterliste 1")
print("und anhängen der Person an die Mitarbeiterliste 2, falls ihr Jahrgang größer Null ist\n")
for username, userinfos in mitarbeiterliste1.items():
print(f"\nUsername: {username}")

name = f'{userinfos["vorname"]} {userinfos["nachname"]}'
jahrgang = userinfos["jahrgang"]

print(f"\tName: {name.title()}")
print(f"\tJahrgang: {jahrgang}")

copy_userid = {username}
copy_nachname = userinfos["vorname"]
copy_vorname = userinfos["nachname"]
copy_jahrgang = userinfos["jahrgang"]

copy_mitarbeiter = {"copy_userid" : {
"vorname": copy_vorname,
"nachname": copy_nachname,
"jahrgang": copy_jahrgang
}
}

alter = 2020 - int(jahrgang)
if int(jahrgang) > 0:
alter = str(alter)
print("\tAlter: " + alter)
print("Altersangabe: Person soll an die zweite Mitarbeiterliste angehängt werden")
# HIER STIMMT WAS NICHT !!
mitarbeiterliste2.update(copy_mitarbeiter)

print("\nAusgabe der aktuellen mitarbeiterliste2")
print(mitarbeiterliste2)

else:
print("keine Altersangabe: keine Übernahme in die zweite Mitarbeiterliste")
print("\nAusgabe der aktuellen mitarbeiterliste2")
print(mitarbeiterliste2)

# ===================================================================================
# Programmende: Schnellausgabe der öffentlichen Mitarbeiter
print("\n===== Programmende: Ausgabe der beiden kompletten Listen: =====")
print("\nMitarbeiterliste 1:")
print(mitarbeiterliste1)
print("\nMitarbeiterliste 2:")
print(mitarbeiterliste2)


##############################################################################
Programmablauf beim Aufruf in der Jupyter-Umgebung:
##############################################################################
Startinhalt der Mitarbeiterliste 1 = Quellliste für den Kopiervorgang
{'admin': {'vorname': 'level 0', 'nachname': 'administrator', 'jahrgang': '0000'}, 'service': {'vorname': 'servicemitarbeiter', 'nachname': 'hard- & software', 'jahrgang': '0000'}}



Startinhalt der Mitarbeiterliste 2 = Zielliste für den Kopiervorgang
{'leereintrag': {'vorname': '', 'nachname': '', 'jahrgang': ''}}



=== Beginn der manuellen Eingabe neuer Mitarbeiter ===
bei Eingabe von'0000' im Feld 'Geburtsjahr' wird der Mitarbeiter nicht
später in die zweite Mitarbeiterliste übernommen
Eingabeende mit 'ende'
userid: hewa
Nachname: hesse
Vorname: walter
Geburtsjahr1953
Ihre Eingaben: Hesse Walter 1953

Mitarbeiter wird an die Mitarbeiterliste 1 angehängt
neuer Stand der Mitarbeiterliste 1
{'admin': {'vorname': 'level 0', 'nachname': 'administrator', 'jahrgang': '0000'}, 'service': {'vorname': 'servicemitarbeiter', 'nachname': 'hard- & software', 'jahrgang': '0000'}, 'hewa': {'vorname': 'walter', 'nachname': 'hesse', 'jahrgang': '1953'}}


Eingabeende mit 'ende'
userid: heki
Nachname: hesse
Vorname: kim
Geburtsjahr1989
Ihre Eingaben: Hesse Kim 1989

Mitarbeiter wird an die Mitarbeiterliste 1 angehängt
neuer Stand der Mitarbeiterliste 1
{'admin': {'vorname': 'level 0', 'nachname': 'administrator', 'jahrgang': '0000'}, 'service': {'vorname': 'servicemitarbeiter', 'nachname': 'hard- & software', 'jahrgang': '0000'}, 'hewa': {'vorname': 'walter', 'nachname': 'hesse', 'jahrgang': '1953'}, 'heki': {'vorname': 'kim', 'nachname': 'hesse', 'jahrgang': '1989'}}


Eingabeende mit 'ende'
userid: chef
Nachname: dr. klöbner
Vorname: nepomuk
Geburtsjahr0000
Ihre Eingaben: Dr. Klöbner Nepomuk 0000

Mitarbeiter wird an die Mitarbeiterliste 1 angehängt
neuer Stand der Mitarbeiterliste 1
{'admin': {'vorname': 'level 0', 'nachname': 'administrator', 'jahrgang': '0000'}, 'service': {'vorname': 'servicemitarbeiter', 'nachname': 'hard- & software', 'jahrgang': '0000'}, 'hewa': {'vorname': 'walter', 'nachname': 'hesse', 'jahrgang': '1953'}, 'heki': {'vorname': 'kim', 'nachname': 'hesse', 'jahrgang': '1989'}, 'chef': {'vorname': 'nepomuk', 'nachname': 'dr. klöbner', 'jahrgang': '0000'}}


Eingabeende mit 'ende'
userid: heri
Nachname: hesse
Vorname: rico
Geburtsjahr1991
Ihre Eingaben: Hesse Rico 1991

Mitarbeiter wird an die Mitarbeiterliste 1 angehängt
neuer Stand der Mitarbeiterliste 1
{'admin': {'vorname': 'level 0', 'nachname': 'administrator', 'jahrgang': '0000'}, 'service': {'vorname': 'servicemitarbeiter', 'nachname': 'hard- & software', 'jahrgang': '0000'}, 'hewa': {'vorname': 'walter', 'nachname': 'hesse', 'jahrgang': '1953'}, 'heki': {'vorname': 'kim', 'nachname': 'hesse', 'jahrgang': '1989'}, 'chef': {'vorname': 'nepomuk', 'nachname': 'dr. klöbner', 'jahrgang': '0000'}, 'heri': {'vorname': 'rico', 'nachname': 'hesse', 'jahrgang': '1991'}}


Eingabeende mit 'ende'
userid: ende
Eingabe beendet


=== Ende der manuellen Eingabe ===
jetzt Ausgabe der einzelnen Personen der Mitarbeiterliste 1
und anhängen der Person an die Mitarbeiterliste 2, falls ihr Jahrgang größer Null ist


Username: admin
Name: Level 0 Administrator
Jahrgang: 0000
keine Altersangabe: keine Übernahme in die zweite Mitarbeiterliste

Ausgabe der aktuellen mitarbeiterliste2
{'leereintrag': {'vorname': '', 'nachname': '', 'jahrgang': ''}}

Username: service
Name: Servicemitarbeiter Hard- & Software
Jahrgang: 0000
keine Altersangabe: keine Übernahme in die zweite Mitarbeiterliste

Ausgabe der aktuellen mitarbeiterliste2
{'leereintrag': {'vorname': '', 'nachname': '', 'jahrgang': ''}}

Username: hewa
Name: Walter Hesse
Jahrgang: 1953
Alter: 67
Altersangabe: Person soll an die zweite Mitarbeiterliste angehängt werden

Ausgabe der aktuellen mitarbeiterliste2
{'leereintrag': {'vorname': '', 'nachname': '', 'jahrgang': ''}, 'copy_userid': {'vorname': 'hesse', 'nachname': 'walter', 'jahrgang': '1953'}}

Username: heki
Name: Kim Hesse
Jahrgang: 1989
Alter: 31
Altersangabe: Person soll an die zweite Mitarbeiterliste angehängt werden

Ausgabe der aktuellen mitarbeiterliste2
{'leereintrag': {'vorname': '', 'nachname': '', 'jahrgang': ''}, 'copy_userid': {'vorname': 'hesse', 'nachname': 'kim', 'jahrgang': '1989'}}

Username: chef
Name: Nepomuk Dr. Klöbner
Jahrgang: 0000
keine Altersangabe: keine Übernahme in die zweite Mitarbeiterliste

Ausgabe der aktuellen mitarbeiterliste2
{'leereintrag': {'vorname': '', 'nachname': '', 'jahrgang': ''}, 'copy_userid': {'vorname': 'hesse', 'nachname': 'kim', 'jahrgang': '1989'}}

Username: heri
Name: Rico Hesse
Jahrgang: 1991
Alter: 29
Altersangabe: Person soll an die zweite Mitarbeiterliste angehängt werden

Ausgabe der aktuellen mitarbeiterliste2
{'leereintrag': {'vorname': '', 'nachname': '', 'jahrgang': ''}, 'copy_userid': {'vorname': 'hesse', 'nachname': 'rico', 'jahrgang': '1991'}}

===== Programmende: Ausgabe der beiden kompletten Listen: =====

Mitarbeiterliste 1:
{'admin': {'vorname': 'level 0', 'nachname': 'administrator', 'jahrgang': '0000'}, 'service': {'vorname': 'servicemitarbeiter', 'nachname': 'hard- & software', 'jahrgang': '0000'}, 'hewa': {'vorname': 'walter', 'nachname': 'hesse', 'jahrgang': '1953'}, 'heki': {'vorname': 'kim', 'nachname': 'hesse', 'jahrgang': '1989'}, 'chef': {'vorname': 'nepomuk', 'nachname': 'dr. klöbner', 'jahrgang': '0000'}, 'heri': {'vorname': 'rico', 'nachname': 'hesse', 'jahrgang': '1991'}}

Mitarbeiterliste 2:
{'leereintrag': {'vorname': '', 'nachname': '', 'jahrgang': ''}, 'copy_userid': {'vorname': 'hesse', 'nachname': 'rico', 'jahrgang': '1991'}}
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Was sollen diese e_-Präfixe an den Variablennamen?
Die while-Bedingung `abbruch == False` wird niemals unwahr sein, also kann man sie gleich durch `True` ersetzen.
Mit False würde man auch nicht explizit vergleichen sondern `not abbruch` verwenden.
Du benutzt f-Strings und innerhalb stückelst Du Strings per + zusammen? Warum?

Um einen einzelnen Eintrag in einem Wörterbuch zu setzen, erzeugt man nicht extra ein Wörterbuch mit einem Eintrag und nutzt dann `update` sondern man setzt einfach den Eintrag direkt.

Code: Alles auswählen

while True:
    # EINGABE
    userid = input("Eingabeende mit 'ende' \nuserid: ")
    if userid == "ende":
        print("\tEingabe beendet\n")
        break
    else:
        nachname = input("Nachname: ")
        vorname = input("Vorname: ")
        jahrgang = input("Geburtsjahr")
    print(f"Ihre Eingaben: {nachname.title()} {vorname.title()} {jahrgang.title()}")
    neuer_mitarbeiter = {
        "vorname": vorname,
        "nachname": nachname,
        "jahrgang": jahrgang,
    }
    print("\nMitarbeiter wird an die Mitarbeiterliste 1 angehängt")
    print("neuer Stand der Mitarbeiterliste 1")
    mitarbeiterliste1[userid] = neuer_mitarbeiter
    print(mitarbeiterliste1)
    print("\n")
Hast Du Dir mal angeschaut welchen Typ `copy_userid` hat? Und der String "copy_userid" hat nichts mit der Variable ´copy_userid` zu tun, denn sonst wäre Dir der falsche Typ aufgefallen.
Die Berechnung des Alters stimmt nicht. Hat nichtmal vor zwei Jahren gestimmt.
Bondying
User
Beiträge: 3
Registriert: Freitag 18. März 2022, 12:55

Danke für die superschnelle Antwort.
Muss aber ein wenig daran arbeiten. Bin wirklicher Neuling auf dem Gebiet und mit 68 Jahren nicht mehr so flott in der Birne wie sicher die meisten Python-Programmierer . Liege jetzt ne Weile im Krankenhaus und lerne Python nur, damit keine Langeweile aufkommt und damit die Birne nicht im Alter einrostet. Also: sorry für die Unzulänglichkeiten.

e_ sollte für 'eingegeben' stehen im Gegensatz zu copy_
Das mit meinen Versuchen mit f-Strings hat nicht immer so funktioniert, wie ich es wollte, hab' halt dann quick und dirty gemacht. Muss da sicher noch Erfahrung sammeln und das säubern
While Bedingung ist klar, war Blödheit!
Berechnung des Alters ist auch sonnenklar, es ging mir aber nur darum, einen numerischen Wert zu bekommen
Aus >>Hast Du Dir mal angeschaut welchen Typ `copy_userid` hat? Und der String "copy_userid" hat nichts mit der Variable ´copy_userid` zu tun, denn sonst wäre Dir der falsche Typ aufgefallen.<< muss ich erst mal schlau werden.
Bondying
User
Beiträge: 3
Registriert: Freitag 18. März 2022, 12:55

Hab's (mit viel Anfängermühe) gefunden.
copy_userid = {username} anstatt copy_userid = username

Danke nochmals für den Tipp mit dem Variablentyp und die anderen Hinweise.

btw: kennst du ein empfehlenswertes Buch oder Tutorial über die Programmierung einer grafischen Oberfläche mit Python?
Antworten