Seite 1 von 1
unzippen eines Dictionaries als Klassenattribut: ValueError: too many values to unpack
Verfasst: Freitag 29. März 2019, 11:43
von stillsen
Hi,
ich verstehe nicht wieso das unzippen meines dictionaries fehlschlaegt.
Waere spitze wenn Ihr mir helfen koenntet das zu verstehen.
Es gibt eine Klasse data_handler mit einem Attribut samples_per_class, was ein dictionary ist.
Code: Alles auswählen
data_handler.samples_per_class = <class 'dict'>: {'Basidiomycota': 5, 'Ascomycota': 190, 'nan': 0, 'Mortierellomycota': 10}
Jedoch kann ich das dict nicht unzippen:
Code: Alles auswählen
x, y = zip(*data_handler.samples_per_class) = ValueError: too many values to unpack (expected 2)
Und direkt auf die values oder keys zugreifen produziert:
Code: Alles auswählen
x = data_handler.samples_per_class.values() = None
y = = data_handler.samples_per_class.keys() = None
Vielen Dank!
Re: unzippen eines Dictionaries als Klassenattribut: ValueError: too many values to unpack
Verfasst: Freitag 29. März 2019, 12:29
von __blackjack__
@stillsen: Wenn `samples_per_class` tatsächlich den Typ `dict` hat, dann sind `x` und `y` im zweiten Beispiel *nicht* an `None` gebunden, sondern an die Werte und die Schlüssel. Je nach Python-Version entweder an Listen, oder an ”view”-Objekte.
Schaust Du hier (ab [4] um zu zeigen was der `zip()`-Versuch als Ergebnis liefert):
Code: Alles auswählen
In [1]: samples_per_class = {'Basidiomycota': 5, 'Ascomycota': 190, 'nan': 0, 'Mortierellomycota': 10}
In [2]: samples_per_class.keys()
Out[2]: dict_keys(['Basidiomycota', 'Ascomycota', 'nan', 'Mortierellomycota'])
In [3]: samples_per_class.values()
Out[3]: dict_values([5, 190, 0, 10])
In [4]: list(samples_per_class)
Out[4]: ['Basidiomycota', 'Ascomycota', 'nan', 'Mortierellomycota']
In [5]: list(zip(*list(samples_per_class)))
Out[5]: [('B', 'A', 'n', 'M'), ('a', 's', 'a', 'o'), ('s', 'c', 'n', 'r')]
Re: unzippen eines Dictionaries als Klassenattribut: ValueError: too many values to unpack
Verfasst: Freitag 29. März 2019, 13:08
von stillsen
danke fuer deine Antwort!
Ich benutze Python 3.5.3
Wenn ich dein [4] und [5] ausfuehre bekomme ich ganz aehnliche Ergebnisse (die unterschiedlichen (Key, Value) Inhalte in meiner Ausfuehrung kommen daher, weil ich gerade was am Code geschraubt habe):
Code: Alles auswählen
data_handler.samples_per_class = <class 'dict'>: {'Mortierellomycota': 11, 'Ascomycota': 189, 'nan': 0, 'Basidiomycota': 5}
list(data_handler.samples_per_class) = <class 'list'>: ['Mortierellomycota', 'Ascomycota', 'nan', 'Basidiomycota']
list(zip(*list(data_handler.samples_per_class))) = <class 'list'>: [('M', 'A', 'n', 'B'), ('o', 's', 'a', 'a'), ('r', 'c', 'n', 's')]
Ich glaube ich habe verpasst zu sagen was ich eigentlich will.
Ich hatte mir erhofft, dass
mir
Code: Alles auswählen
x= ['Mortierellomycota', 'Ascomycota', 'nan', 'Basidiomycota']
y= [11, 189, 0, 5]
liefert.
Re: unzippen eines Dictionaries als Klassenattribut: ValueError: too many values to unpack
Verfasst: Freitag 29. März 2019, 13:26
von pillmuncher
@stillsen: Warum so kompliziert? Warum nicht über den Weg, den Python für sowas vorgesehen hat?
Code: Alles auswählen
>>> d = {'Mortierellomycota': 11, 'Ascomycota': 189, 'nan': 0, 'Basidiomycota': 5}
>>> d
{'Mortierellomycota': 11, 'Ascomycota': 189, 'nan': 0, 'Basidiomycota': 5}
>>> x = list(d.keys())
>>> y = list(d.values())
>>> x
['Mortierellomycota', 'Ascomycota', 'nan', 'Basidiomycota']
>>> y
[11, 189, 0, 5]
Re: unzippen eines Dictionaries als Klassenattribut: ValueError: too many values to unpack
Verfasst: Freitag 29. März 2019, 13:28
von ThomasL
warum sollte zip sowas machen?
wie wäre es hiermit:
Code: Alles auswählen
x,y = data_handler.samples_per_class.keys(), data_handler.samples_per_class.values()
Arrgh, pillmuncher was faster....

Re: unzippen eines Dictionaries als Klassenattribut: ValueError: too many values to unpack
Verfasst: Freitag 29. März 2019, 14:40
von stillsen
sehr gute Frage!
gibt mir genau was ich will.
dankoe!
Re: unzippen eines Dictionaries als Klassenattribut: ValueError: too many values to unpack
Verfasst: Freitag 29. März 2019, 20:50
von Sirius3
@pillmuncher: weil das voraussetzt, dass die Reihenfolge von keys und values die selbe ist.
Sonst ist die Lösung:
Re: unzippen eines Dictionaries als Klassenattribut: ValueError: too many values to unpack
Verfasst: Freitag 29. März 2019, 21:14
von pillmuncher
@Sirius3: Stimmt. Allerdings ist seit Py3.7 garantiert, dass die Reihenfolge gleich ist. Siehe
https://docs.python.org/3/library/stdty ... dict-views
Re: unzippen eines Dictionaries als Klassenattribut: ValueError: too many values to unpack
Verfasst: Freitag 29. März 2019, 23:48
von bords0
Nein, dass die Reihenfolge con keys() und values() die gleiche ist, das ist schon länger garantiert:
https://docs.python.org/release/1.5.2p2 ... pping.html
Neu ist in 3.7, dass die Reihenfolge auch noch der Reihenfolge des Einfügens ins dictionary entspricht. Die war vorher explizit relativ beliebig (wenn auch nicht zufällig). Geändert hat sie sich aber nur, wenn etwas eingefügt oder gelöscht wurde.
Re: unzippen eines Dictionaries als Klassenattribut: ValueError: too many values to unpack
Verfasst: Samstag 30. März 2019, 00:02
von pillmuncher
@bords0: Danke. Seit ich kaum mehr in Python programmiere, vergesse ich scheinbar alles, was ich schon mal wusste.
Re: unzippen eines Dictionaries als Klassenattribut: ValueError: too many values to unpack
Verfasst: Samstag 30. März 2019, 09:35
von ThomasL
Sirius3 hat geschrieben: Freitag 29. März 2019, 20:50
Sonst ist die Lösung:
@Sirius3 Ich möchte zu dieser genialen Lösung nur anmerken, dass x und y dann Tuple sind, keine Listen.
Sollte letzteres, warum auch immer, nötig sein, ist der Weg über list(d.keys()) etc. schneller.