假设我有一个字符列表,我想将每个字符映射到列表中出现的次数。以下代码实现了这一点:
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()。谢谢!
答案 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']