Python:使用.append()检索和修改字典中的值时出错?

时间:2013-04-12 07:20:06

标签: python dictionary key append

假设我有一个字符列表,我想将每个字符映射到列表中出现的次数。以下代码实现了这一点:

characters = ['a','b','c','a']
d = {}
for ch in characters:
   d[ch] = d.get(ch,0) + 1
return d

现在让我们说,不是将每个字符映射到列表中出现的次数,而是将其映射到1的列表,其中每个字符代表列表中的出现。例如,像{a:[1,1],b:[1],c:[1]}之类的东西。我使用相同的格式,但它不起作用。有人可以解释为什么不呢?

characters = ['a','b','c','a']
d = {}
for ch in characters:
   d[ch] = d.get(ch,[]).append(1)
#print type(d['a'])
return d

我得到AttributeError:'NoneType'对象没有属性'append',即使打印类型(d ['a'])返回“list”,如果我删除for循环中的.append()。谢谢!

5 个答案:

答案 0 :(得分:2)

characters = ['a','b','c','a']
d = {}
for ch in characters:
   d[ch] = d.get(ch,[]).append(1)
#print type(d['a'])
return d

dict.get返回键ch处的值,如果它不存在,则返回您提供的默认值,即您创建的列表[]。无论如何,我认为你可能会感到困惑,因为d.get没有设置任何值,它只返回一个值。然后,您将1附加到此列表中。 .append是一个inplace操作,因此它不会像您预期的那样返回附加后的列表,它只返回None以表示它不应该按照您的方式使用。你可以做的是

d.setdefault(ch, []).append(1)

你会期望做什么;) 为了避免这种疯狂的语法,你可以像collections.defaultdict这样使用:

d = defaultdict(list)
d[ch].append(1)

看起来更干净

答案 1 :(得分:0)

您将d[ch]的值分配给[].append的返回值。可以这样想,你的代码相当于

tmp = d.get(ch,[])
d[ch] = tmp.append(1)

请改为尝试:

d[ch] = d.get(ch,[])
d[ch].append(1)

答案 2 :(得分:0)

d[ch] = d.get(ch,[]).append(1)d[ch]设置为append函数返回的值,即无。这样做:

d[ch] = d.get(ch, [])
d[ch].append(1)

答案 3 :(得分:0)

这是我提出的解决方案:

characters = ['a','b','c','a']
d = {}
for ch in characters:
    d.setdefaultappend(ch, []).append(1)
return d

答案 4 :(得分:-1)

使用python dir函数

list有附加方法

dist没有附加方法

>>> characters = []
>>> d = {}
>>> dir(characters)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', 
'__delslice__', '__doc__', '__eq__', '__format__', '__ge__', 
'__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', 
'__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', 
'__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', 
'__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', 
'__setslice__', '__sizeof__', '__str__', '__subclasshook__', 'append',
'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

>>> dir(d)
['__class__', '__cmp__', '__contains__', '__delattr__', '__delitem__', '__doc__', 
'__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', 
'__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', 
'__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', 
'__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 
'has_key', 'items', 'iteritems', 'iterkeys', 'itervalues', 'keys', 'pop', 
'popitem', 'setdefault', 'update', 'values', 'viewitems', 'viewkeys', 'viewvalues']