Seite 1 von 2
liste als key in dictionary
Verfasst: Donnerstag 27. Oktober 2022, 08:22
von blutigeranfaenger
Hallo zusammen,
ich möchte gerne zwei listen zu einem dictionary vereinen:
Code: Alles auswählen
#!/usr/bin/env python3
l_a = [ [0, 1, 2, 3], [0, 1, 2, 4], [0, 1, 2, 5]]
l_b = [1,2,3]
mydict = dict(zip(l_a,l_b))
Das klappt so nicht, ich weiß, eine Liste kann kein key in einem Wörterbuch sein.
Gibt es dennoch einen Weg, das gewünschte Ziel zu erreichen und wie könnte dieser Weg gehen?
Danke für eure Tipps!
Re: liste als key in dictionary
Verfasst: Donnerstag 27. Oktober 2022, 08:34
von Dennis89
Hallo,
so?
Code: Alles auswählen
Python 3.10.7 (main, Sep 7 2022, 00:00:00) [GCC 12.2.1 20220819 (Red Hat 12.2.1-1)] on linux
l_a = [ [0, 1, 2, 3], [0, 1, 2, 4], [0, 1, 2, 5]]
l_b = [1,2,3]
list_to_dic = {}
for index, key in enumerate(l_b):
list_to_dic[key] = l_a[index]
print(list_to_dic)
{1: [0, 1, 2, 3], 2: [0, 1, 2, 4], 3: [0, 1, 2, 5]}
Grüße
Dennis
Re: liste als key in dictionary
Verfasst: Donnerstag 27. Oktober 2022, 09:17
von __deets__
Du kannst die Listen zu Tupeln machen, die gehen durch ihre immutability als Keys.
Re: liste als key in dictionary
Verfasst: Donnerstag 27. Oktober 2022, 10:02
von blutigeranfaenger
Ja, super, das hat funktioniert, vielen Dank!
Re: liste als key in dictionary
Verfasst: Donnerstag 27. Oktober 2022, 10:40
von Dennis89
Damit der Vorschlag von @__deets__ auch noch hier steht:
Code: Alles auswählen
l_a = [(0, 1, 2, 3), (0, 1, 2, 4), (0, 1, 2, 5)]
l_b = [1, 2, 3]
list_to_dict = dict(zip(l_b, l_a))
print(list_to_dict)
{1: (0, 1, 2, 3), 2: (0, 1, 2, 4), 3: (0, 1, 2, 5)}
War das so gemeint?
Grüße
Dennis
Re: liste als key in dictionary
Verfasst: Donnerstag 27. Oktober 2022, 11:48
von __deets__
Nein. Du hast dir hier die Freiheit genommen, Schluessel und Werte umzudrehen. Das ist etwas komplett anderes, und loest die Aufgabe nicht. Egal, ob dann die Werte Tupel statt Listen sind.
Es geht darum, das die Schluessel Tupel sein muessen, weil es aus technischen und logischen Gruenden nicht moeglich und sinnvoll ist, vereaenderbare Schluessel zuzulassen. Und natuerlich muessen die Schluessel nach wie vor prinzipiell gleich sein, ich will nicht nach 1 schauen, ich will [0, 1, 2, 3] nachschlagen.
Re: liste als key in dictionary
Verfasst: Donnerstag 27. Oktober 2022, 12:28
von Dennis89
Achsoooo, da habe ich den Eingangspost falsch verstanden und dann war ja schon mein erster Post Mist.
Danke für die Verbesserung.
Grüße
Dennis
Edit:
Du hast dir hier die Freiheit genommen, Schluessel und Werte umzudrehen.
So lassen sich Probleme einfacher lösen

Re: liste als key in dictionary
Verfasst: Donnerstag 27. Oktober 2022, 16:49
von DeaD_EyE
Die keys eines dicts müssen immutable sein. Ein set kann man nicht als key nehmen, aber ein frozenset geht. Eine Tuple geht auch, da sie nicht veränderbar ist.
Re: liste als key in dictionary
Verfasst: Donnerstag 27. Oktober 2022, 16:57
von kbr
Tuple sind ein Grenzfall: sollten die Inhalte eines Tuple mutable sein, dann geht es gleichfalls nicht.
Re: liste als key in dictionary
Verfasst: Donnerstag 27. Oktober 2022, 17:09
von __deets__
Grenzfall wuerde ich das jetzt nicht nennen. Der Schluessel muss einfach transitiv immutable sein. Letztlich folgt das aus der Notwendigkeit fuer Schluessel vergleichbar zu sein. Und der ==-Operator ist fuer Tupel elementweise definiert, gleiches gilt fuer Listen. Womit ein Tupel mit einer Liste als Element nicht zulaessig ist, denn die Liste liesse sich ja nachtraeglich veraendern, und waere nicht mehr gleich.
Re: liste als key in dictionary
Verfasst: Donnerstag 27. Oktober 2022, 17:20
von kbr
Das meine ich ja: der Datentyp Tuple selbst is immutable; dies muss aber auch für den Value des Tuples gelten, damit es als Key verwendbar ist.
Re: liste als key in dictionary
Verfasst: Donnerstag 27. Oktober 2022, 18:04
von bords0
Es geht letztlich nicht um mutability sondern um hashability. Also mutable darf es schon sein, solange es auch hashable ist.
Mit selbst definierten Klassen kann man das durchaus machen. Es ist nach meiner Erfahrung aber nur selten sinnvoll.
Re: liste als key in dictionary
Verfasst: Donnerstag 27. Oktober 2022, 19:06
von kbr
Hashable allein genügt nicht, es muss auch stets der gleiche hash-Wert erzeugt werden. Daher scheiden Datentypen mit mutablen Inhalten als Keys aus.
Re: liste als key in dictionary
Verfasst: Freitag 28. Oktober 2022, 13:39
von DeaD_EyE
kbr hat geschrieben: Donnerstag 27. Oktober 2022, 16:57
Tuple sind ein Grenzfall: sollten die Inhalte eines Tuple mutable sein, dann geht es gleichfalls nicht.
Stimmt. Auf die Idee, so etwas zu machen, bin ich noch nie gekommen.
Dach höchste aller Gefühle: Tuple als Key, wobei die Tuple ausschließlich einen Datentypen enthält (int z.B.).
Hier mal etwas anderes komisches, dass halb funktioniert.
Der Liste wird trotz einer Exception das Objekt hinzugefügt (== list.extend).
TypeError: 'tuple' object does not support item assignment
Danach ist das letzte Element: [1]
Re: liste als key in dictionary
Verfasst: Freitag 28. Oktober 2022, 13:50
von bords0
kbr hat geschrieben: Donnerstag 27. Oktober 2022, 19:06
Hashable allein genügt nicht, es muss auch stets der gleiche hash-Wert erzeugt werden. Daher scheiden Datentypen mit mutablen Inhalten als Keys aus.
Das ist nicht korrekt. Um key in einem dictionary zu sein, reicht es aus, wenn hash() einen Wert liefert (d.h. wenn man __hash__() geeignet implementiert). Wenn sich der hash-Wert ändert, findet man den Schlüssel nicht mehr, das sollte man also auf keinen Fall tun. Der hash-Wert darf also nicht von den mutablen Teilen abhängen.
Ich habe z.B. schon gesehen, dass __hash__ die id zurückgibt.
Man könnte aber auch den hash von zwei Attributen verwenden, und alle anderen Attribute könnten dann veränderbar sein.
Oder der hash ist zwar veränderlich, aber die Objekte werden nicht verändert, während sie in ein set gesteckt werden oder so.
Wichtig: Aus Gleichheit von Objekten muss immer auch die Gleichheit der hashes folgen. (Laut Doku die einzige erforderliche Eigenschaft von __hash__().)
https://docs.python.org/3/reference/dat ... t.__hash__
Re: liste als key in dictionary
Verfasst: Freitag 28. Oktober 2022, 13:56
von bords0
DeaD_EyE hat geschrieben: Freitag 28. Oktober 2022, 13:39
TypeError: 'tuple' object does not support item assignment
Danach ist das letzte Element: [1]
Das liegt am augmented assignment. Das macht die Liste größer, und dann nochmal die Zuweisung, "assignment" eben, auch wenn es "augmented" ist. Verwirrend, aber hat Methode

In Langform:
Code: Alles auswählen
tup = (1, 2, [])
# Langform von tup[-1] += [1]
temp = tup[-1]
temp += [1] # geht noch
tup[-1] = temp # TypeError
Re: liste als key in dictionary
Verfasst: Freitag 28. Oktober 2022, 13:58
von __blackjack__
@bords0: Das ist im Grunde doch korrekt. Du schreibst ja selbst das

, deren Hashwert sich ändert, dann nicht mehr wiedergefunden werden. Um das sinnvoll als

verwenden zu können, darf sich der Hashwert nicht ändern, denn sinnvoll wäre ja schon, das man

auch wiederfindet.

Re: liste als key in dictionary
Verfasst: Freitag 28. Oktober 2022, 14:26
von __blackjack__
Ist natürlich ein Implementierungsdetail, aber die Implementierung von `object.__hash__()` ist nahe dran die ID als Hash-Wert zu liefern:
Code: Alles auswählen
In [221]: a = object()
In [222]: hex(id(a))
Out[222]: '0x7f5d2454d570'
In [223]: hex(hash(a))
Out[223]: '0x7f5d2454d57'
Der Hash-Wert ist die ID um 4 Bits nach rechts verschoben. Und die ID (ebenfalls Implementierungsdetail) ist die Speicheradresse. Ich vermute mal Objekte sind mittlerweile mindestens 16 Bytes gross. Jup:
Re: liste als key in dictionary
Verfasst: Freitag 28. Oktober 2022, 14:29
von Sirius3
@DeaD_EyE: das Assignment ist wichtig, denn wenn man
möchte man ja, dass 4 in der Liste steht, aber das Objekt 3 ist unveränderlich, += muß also ein neues Objekt zurückliefern.
Re: liste als key in dictionary
Verfasst: Freitag 28. Oktober 2022, 17:14
von bords0
__blackjack__ hat geschrieben: Freitag 28. Oktober 2022, 13:58
@bords0: Das ist im Grunde doch korrekt. Du schreibst ja selbst das

, deren Hashwert sich ändert, dann nicht mehr wiedergefunden werden. Um das sinnvoll als

verwenden zu können, darf sich der Hashwert nicht ändern, denn sinnvoll wäre ja schon, das man

auch wiederfindet.
"Mutable Inhalte" ist nicht das gleiche wie "veränderlicher Hashwert".
Natürlich sollte man den Hashwert nicht ändern, wenn man den alten noch braucht.