0

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

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

现在假设,我不想将每个字符映射到它在列表中出现的次数,而是将它映射到一个 1 的列表,其中每个 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' object has no attribute 'append',即使如果我删除 for 循环中的 .append() 打印类型(d['a']) 会返回“list”。谢谢!

4

5 回答 5

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是一个就地操作,因此它不会像您预期的那样返回后附加列表,它只是返回None以表示它不应该以您的方式使用。你可以做的是

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

哪个符合您的期望;)为了避免这种疯狂的语法,您可以使用collections.defaultdict如下所示:

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

看起来更干净

于 2013-04-12T07:46:06.127 回答
0

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

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

试试这个:

d[ch] = d.get(ch,[])
d[ch].append(1)
于 2013-04-12T07:26:08.250 回答
0

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

d[ch] = d.get(ch, [])
d[ch].append(1)
于 2013-04-12T07:50:00.417 回答
0

这是我提出的解决方案:

characters = ['a','b','c','a']
d = {}
for ch in characters:
    d.setdefaultappend(ch, []).append(1)
return d
于 2013-04-12T09:11:10.323 回答
-1

使用pythondir函数

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']
于 2013-04-12T07:33:31.547 回答