Ich versuche eine Datei zu nehmen, die so aussieht
AAA x 111
AAB x 111
AAA x 112
AAC x 123
...
Und verwenden Sie ein Wörterbuch, damit die Ausgabe so aussieht
{AAA: ['111', '112'], AAB: ['111'], AAC: [123], ...}
Das habe ich versucht
file = open("filename.txt", "r")
readline = file.readline().rstrip()
while readline!= "":
list = []
list = readline.split(" ")
j = list.index("x")
k = list[0:j]
v = list[j + 1:]
d = {}
if k not in d == False:
d[k] = []
d[k].append(v)
readline = file.readline().rstrip()
Ich bekomme immer eine TypeError: unhashable type: 'list'
. Ich weiß, dass Schlüssel in einem Wörterbuch keine Listen sein können, aber ich versuche, meinen Wert in eine Liste zu verwandeln, die nicht der Schlüssel ist. Ich frage mich, ob ich irgendwo einen Fehler gemacht habe.
quelle
Hash-Werte sind nur Ganzzahlen, mit denen Wörterbuchschlüssel während einer Wörterbuchsuche schnell verglichen werden.
Intern
hash()
ruft method die__hash__()
Methode eines Objekts auf, die standardmäßig für jedes Objekt festgelegt ist.Konvertieren einer verschachtelten Liste in eine Gruppe
Dies geschieht aufgrund der Liste in einer Liste, die nicht gehasht werden kann. Was durch Konvertieren der internen verschachtelten Listen in ein Tupel gelöst werden kann ,
Explizites Hashing einer verschachtelten Liste
quelle
Sie versuchen,
k
(was eine Liste ist) als Schlüssel für zu verwendend
. Listen sind veränderbar und können nicht als Diktatschlüssel verwendet werden.Außerdem initialisieren Sie die Listen im Wörterbuch aufgrund dieser Zeile nie:
Welches sollte sein:
Welches sollte eigentlich sein:
quelle
Der Grund, warum Sie die
unhashable type: 'list'
Ausnahme erhalten, ist, dassk = list[0:j]
Setsk
ein "Slice" der Liste sind, was logischerweise eine andere, oft kürzere Liste ist. Was Sie brauchen, ist, nur das erste Element in der Liste zu erhalten, das so geschrieben istk = list[0]
. Das gleichev = list[j + 1:]
sollte nurv = list[2]
für das dritte Element der Liste gelten, das vom Aufruf an zurückgegeben wurdereadline.split(" ")
.Ich habe einige andere wahrscheinliche Probleme mit dem Code bemerkt, von denen ich einige erwähnen werde. Ein großer Punkt ist, dass Sie nicht (neu) initialisieren möchten
d
mitd = {}
für jede Zeile in der Schleife zu lesen. Ein weiterer Grund ist, dass es im Allgemeinen keine gute Idee ist, Variablen wie die integrierten Typen zu benennen, da Sie dadurch nicht auf einen von ihnen zugreifen können, wenn Sie ihn benötigen - und es ist verwirrend für andere, die an den gewöhnt sind Namen, die einen dieser Standardartikel bezeichnen. Aus diesem Grund sollten Sie Ihre Variablenvariablelist
anders umbenennen , um solche Probleme zu vermeiden.Hier ist eine funktionierende Version von Ihnen mit diesen Änderungen. Ich habe auch den
if
Anweisungsausdruck vereinfacht , mit dem überprüft wird, ob der Schlüssel bereits im Wörterbuch enthalten ist. Es gibt noch kürzere implizite Möglichkeiten, dies zu tun, jedoch unter Verwendung einer Bedingung Aussage ist vorerst in Ordnung.Ausgabe:
quelle
Das
TypeError
passiert, weilk
es sich um eine Liste handelt, da sie mit einem Slice aus einer anderen Liste mit der Zeile erstellt wirdk = list[0:j]
. Dies sollte wahrscheinlich so etwas seink = ' '.join(list[0:j])
, also haben Sie stattdessen eine Zeichenfolge.Darüber hinaus ist Ihre
if
Aussage falsch, wie in Jesses Antwort vermerkt, die lauten sollteif k not in d
oderif not k in d
(ich bevorzuge letzteres).Sie löschen auch Ihr Wörterbuch bei jeder Iteration, da Sie sich
d = {}
in Ihrerfor
Schleife befinden.Beachten Sie, dass Sie auch keine
list
oderfile
als Variablennamen verwenden sollten, da Sie integrierte Funktionen maskieren.So würde ich Ihren Code umschreiben:
Die
dict.setdefault()
obige Methode ersetzt dieif k not in d
Logik aus Ihrem Code.quelle
not k in d
könnte ein Anfänger verwirren(not k) in d
, während, währendk not in d
keine Mehrdeutigkeit hatnot in
ist, wie er als Operator aufgeführt ist .!a.contains(b)
.not in
mag pythonischer sein, ich finde das Konzept von zwei Wortoperatoren nur verwirrender als die Verwendung einer Umkehrung eines booleschen Ausdrucks.quelle