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: 17
Registriert: Montag 2. November 2020, 16:52

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: 644
Registriert: Freitag 20. Oktober 2017, 16:10

Moin,

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

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: 17
Registriert: Montag 2. November 2020, 16:52

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: 644
Registriert: Freitag 20. Oktober 2017, 16:10

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: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

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: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

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: 17
Registriert: Montag 2. November 2020, 16:52

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: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@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: 17
Registriert: Montag 2. November 2020, 16:52

@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: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

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: 17
Registriert: Montag 2. November 2020, 16:52

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: 13065
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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”.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Stift005
User
Beiträge: 17
Registriert: Montag 2. November 2020, 16:52

Okay danke. Da muss ich mich dann nochmal einlesen
Antworten