Seite 1 von 1

Problem mit zip methode

Verfasst: Freitag 9. April 2021, 17:23
von Stift005
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

Re: Problem mit zip methode

Verfasst: Freitag 9. April 2021, 18:07
von narpfel
Moin,

was würdest du denn erwarten, wenn du das Dict von Hand umdrehst?

Re: Problem mit zip methode

Verfasst: Freitag 9. April 2021, 18:13
von Stift005
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

Re: Problem mit zip methode

Verfasst: Freitag 9. April 2021, 18:14
von Stift005
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

Re: Problem mit zip methode

Verfasst: Freitag 9. April 2021, 18:42
von narpfel
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.

Re: Problem mit zip methode

Verfasst: Freitag 9. April 2021, 19:22
von ThomasL
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'}

Re: Problem mit zip methode

Verfasst: Freitag 9. April 2021, 19:33
von pillmuncher
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()

Re: Problem mit zip methode

Verfasst: Freitag 9. April 2021, 22:19
von Stift005
Erstmal danke für Eure Antworten!
Bin noch auf dem Beginner-Level... Werd' mir aber morgen mal eure Lösungswege näher ansehen.

Re: Problem mit zip methode

Verfasst: Samstag 10. April 2021, 11:27
von Sirius3
@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.

Re: Problem mit zip methode

Verfasst: Sonntag 11. April 2021, 19:05
von Stift005
@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.

Re: Problem mit zip methode

Verfasst: Sonntag 11. April 2021, 19:18
von Sirius3
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.

Re: Problem mit zip methode

Verfasst: Sonntag 11. April 2021, 20:01
von Stift005
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.

Re: Problem mit zip methode

Verfasst: Sonntag 11. April 2021, 20:06
von __blackjack__
@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”.

Re: Problem mit zip methode

Verfasst: Sonntag 11. April 2021, 20:28
von Stift005
Okay danke. Da muss ich mich dann nochmal einlesen