Problem mit zip methode

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
Stift005
User
Beiträge: 14
Registriert: Montag 2. November 2020, 16:52

Freitag 9. April 2021, 17:23

Hallo zusammen,

die zip-methode möchte nicht so ganz wie ich es möchte. :D

Ich möchte die keys und values in einem dictionary vertauschen. Also aus den values sollen die keys werden.

Mein Ansatz sah nun so aus:

Code: Alles auswählen

alter = {
    'lisa': 19,
    'michael': 22,
    'sebastian': 18,
    'zheng': 23,
    'theo': 26,
    'alex': 19,
    'nick': 19
}

def drehe_dic(d):
## Erstellt Liste mit den Keys aus alter
    keyList = d.keys() 
    
## Erstellt Liste mit den Values aus alter
    valueList = []
    for key in d:
        valueList.append(d[key])
    
## Erstellt aus beiden Listen ein Dictionary
    
    return dict(zip(valueList,keyList))


print("Ergebnis: ", drehe_dic(alter))
AUSGABE: {19: 'nick', 22: 'michael', 18: 'sebastian', 23: 'zheng', 26: 'theo'}

Offenbar werden also 2 Einträge "verschluckt". Nur warum?
Habe die Länge beider Listen geprüft, sind beide gleich lang (7).
Und wenn ich die 2 Listen "andersherum" zippe, funktioniert es auch und ich erhalte wieder das Eingangs-Dictionary. :?:

Würd mich freuen, wenn mir jemand helfen könnte
narpfel
User
Beiträge: 367
Registriert: Freitag 20. Oktober 2017, 16:10

Freitag 9. April 2021, 18:07

Moin,

was würdest du denn erwarten, wenn du das Dict von Hand umdrehst?
Stift005
User
Beiträge: 14
Registriert: Montag 2. November 2020, 16:52

Freitag 9. April 2021, 18:13

Das alle Einträge berücksichtigt werden also:

19: 'nick', 22: 'michael', 18: 'sebastian', 23: 'zheng', 26: 'theo', 19: 'alex', 19: 'lisa'

AAACH, ich depp.. In einem Dic sind die Schlüssel ja einzigartig. Deswegen fehlen die letzten 2... Oder? :D
Stift005
User
Beiträge: 14
Registriert: Montag 2. November 2020, 16:52

Freitag 9. April 2021, 18:14

Stift005 hat geschrieben:
Freitag 9. April 2021, 18:13
Das alle Einträge berücksichtigt werden also:

19: 'nick', 22: 'michael', 18: 'sebastian', 23: 'zheng', 26: 'theo', 19: 'alex', 19: 'lisa'

Edit: AAACH, ich depp.. In einem Dic sind die Schlüssel ja einzigartig. Deswegen fehlen die letzten 2... Oder? :D
narpfel
User
Beiträge: 367
Registriert: Freitag 20. Oktober 2017, 16:10

Freitag 9. April 2021, 18:42

Bingo, dein `dict(zip(...))` fügt im Prinzip drei Werte für den Schlüssel 19 hinzu, da bleibt natürlich nur der letzte über.
Benutzeravatar
ThomasL
User
Beiträge: 1062
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Freitag 9. April 2021, 19:22

Warum alles so kompliziert:

Code: Alles auswählen

alter = {
    'lisa': 19,
    'michael': 22,
    'sebastian': 18,
    'zheng': 23,
    'theo': 26,
    'alex': 19,
    'nick': 19
}

alter_reversed = {value: key for key, value in alter.items()}

print(alter_reversed)

>>{19: 'nick', 22: 'michael', 18: 'sebastian', 23: 'zheng', 26: 'theo'}
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
Benutzeravatar
pillmuncher
User
Beiträge: 1257
Registriert: Samstag 21. März 2009, 22:59
Wohnort: München

Freitag 9. April 2021, 19:33

In Python löst man sowas so:

Code: Alles auswählen

from collections import defaultdict

def invert(mapping):
    result = defaultdict(list)
    for key, value in mapping.items():
        result[value].append(key)
    return result

def main():
    alter = {
        'lisa': 19,
        'michael': 22,
        'sebastian': 18,
        'zheng': 23,
        'theo': 26,
        'alex': 19,
        'nick': 19
    }
    print(invert(alter))

if __name__ == '__main__':
    main()
In specifications, Murphy's Law supersedes Ohm's.
Stift005
User
Beiträge: 14
Registriert: Montag 2. November 2020, 16:52

Freitag 9. April 2021, 22:19

Erstmal danke für Eure Antworten!
Bin noch auf dem Beginner-Level... Werd' mir aber morgen mal eure Lösungswege näher ansehen.
Sirius3
User
Beiträge: 14425
Registriert: Sonntag 21. Oktober 2012, 17:20

Samstag 10. April 2021, 11:27

@Stift005: noch zu seinem Code:
Benutze keine komischen Abkürzungen. Das t in drehe_dic passte nicht mehr rein? Mischformen aus Deutsch und englisch sind auch nicht so gut lesbar, vor allem weil drehe das einzig deutsche Wort ist. Variablen schreibt man komplett klein. Typen haben im Namen nichts verloren, vor allem weil keyList gar keine Liste ist. keys und values wären perfekte Namen.
Stift005
User
Beiträge: 14
Registriert: Montag 2. November 2020, 16:52

Sonntag 11. April 2021, 19:05

@Sirus3: Das ganze ist eine Übungsaufgabe von der Uni aus. Und witzigerweise hat eben diese den Methoden-Namen vorgegeben. Also zumindest das geht nicht auf meine Kappe. :D
Das mit der keyList ist mir dann auch noch aufgefallen. Hab also noch ein (list) davor gesetzt. Nu isses eine ^^

Trotzdem danke. Werde ich künftig drauf achten.
Sirius3
User
Beiträge: 14425
Registriert: Sonntag 21. Oktober 2012, 17:20

Sonntag 11. April 2021, 19:18

Du weißt selbst, dass das Unsinn ist, oder?

Wenn schon `zip`, dann konsequent:

Code: Alles auswählen

def invert_dictionary(dictionary):
    keys, values = zip(*dictionary.items())
    return dict(zip(values, keys))

dreh_dic = invert_dictionary # this ugly name is dictated by the exercise.
Stift005
User
Beiträge: 14
Registriert: Montag 2. November 2020, 16:52

Sonntag 11. April 2021, 20:01

Sry aber nein deswegen muss ich dann doch nochmal doof nachfragen. Ich hatte das so verstanden, dass du meintest keyList ist keine Liste weil keys() eig. ein Set zurückgibt. An anderer Stelle hab ich jetzt gelesen keys() gibt eine Liste zurück, also ist das list() dann tatsächlich überflüssig.
Nu bin ich verwirrt.
Benutzeravatar
__blackjack__
User
Beiträge: 8572
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Sonntag 11. April 2021, 20:06

@Stift005: `dict.keys()` gibt etwas zurück was einem `set` ähnlich ist, aber nicht alles kann was ein `set` kann. Alle Methoden bis auf `isdisjoint()` fehlen beispielsweise. Und das Objekt ist nur ein ”view”, dass heisst es ist weiterhin mit dem Inhalt des `dict`-Objekts ”verbunden”.
“Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”
Stift005
User
Beiträge: 14
Registriert: Montag 2. November 2020, 16:52

Sonntag 11. April 2021, 20:28

Okay danke. Da muss ich mich dann nochmal einlesen
Antworten