简体   繁体   中英

Python : AttributeError: 'int' object has no attribute 'append'

I have a dict of int, list. What I'm trying to do is loop through `something' and if the key is present in the dict add the item to the lsit or else create a new list and add the item. This is my code.

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

My question is two-fold. 1. I get the following error, Line 27: AttributeError: 'int' object has no attribute 'append' Line 27 is the line marked with *** What am I missing that's leading to the error.

  1. How can I run this algorithm of checking key and adding to a list in a dict more pythonically.

You set a list first, then replace that list with the value:

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

Drop that last line, it breaks your code.

Instead of using if...else , you could use the dict.setdefault() method to assign an empty list when the key is missing, and at the same time return the value for the key:

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

This one line replaces your 6 if: ... else ... lines.

You could also use a collections.defaultdict() object :

from collections import defaultdict

levels = defaultdict(list)

and

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

For missing keys a list object is automatically added. This has a downside: later code with a bug in it that accidentally uses a non-existing key will get you an empty list, making matters confusing when debugging that error.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM