2017-07-04 6 views
-1

Ich habe ein Diktat von Int, Liste. Was ich versuche zu tun ist durch "etwas" zu durchlaufen und wenn der Schlüssel im dict vorhanden ist, fügen Sie das Element zum lsit hinzu oder erstellen Sie eine neue Liste und fügen Sie das Element hinzu. Das ist mein Code.Python: AttributeError: 'int' Objekt hat kein Attribut 'append'

levels = {} 
if curr_node.dist in levels: 
    l = levels[curr_node.dist] 
    l.append(curr_node.tree_node.val)...........*** 
else: 
    levels[curr_node.dist] = [] 
    levels[curr_node.dist].append(curr_node.tree_node.val) 
    levels[curr_node.dist] = curr_node.tree_node.val 

Meine Frage ist zweifach. 1. Ich bekomme den folgenden Fehler, Line 27: AttributeError: 'int' object has no attribute 'append' Line 27 is the line marked with *** Was fehlt mir das führt zu dem Fehler.

  1. Wie kann ich diesen Algorithmus des Schlüssels zu überprüfen und Hinzufügen zu einer Liste in einem dict mehr pythonisch.
+0

Sie haben hier eine ganze Zahl zugewiesen: 'levels [curr_node.dist] = curr_node.tree_node.val'. Was soll das denn machen, du hast das Listenobjekt dort ersetzt. –

+0

'l' hat einen Rückgabewert von dict. Wenn es eine Ganzzahl ist. Sie versuchen, eine Ganzzahl anzufügen, die diesen Fehler verursacht –

Antwort

2

Sie legen eine Liste zuerst, dann diese Liste ersetzen mit dem Wert:

else: 
    levels[curr_node.dist] = [] 
    levels[curr_node.dist].append(curr_node.tree_node.val) 
    levels[curr_node.dist] = curr_node.tree_node.val 

Tropfen, die letzte Zeile, es Ihren Code bricht.

Statt if...else verwenden, könnten Sie die dict.setdefault() method verwenden, um eine leere Liste zuweisen, wenn der Schlüssel fehlt, und zugleich den Wert für den Schlüssel zurück:

levels.setdefault(curr_node.dist, []).append(curr_node.tree_node.val) 

Diese eine Zeile ersetzt Ihre 6 if: ... else ... Zeilen.

from collections import defaultdict 

levels = defaultdict(list) 

und

levels[curr_node.dist].append(curr_node.tree_node.val) 

Für fehlende Schlüssel ein Listenobjekt wird automatisch hinzugefügt:

Sie könnten auch einen collections.defaultdict() object verwenden. Das hat einen Nachteil: Ein späterer Code mit einem Fehler, der versehentlich einen nicht vorhandenen Schlüssel verwendet, führt zu einer leeren Liste, was beim Debuggen dieses Fehlers für Verwirrung sorgt.

Verwandte Themen