在python中我想使用字典get方法构建一个数组字典,默认情况下提供一个空列表然后填充信息,例如:
dict = {}
for i in range( 0, 10 ):
for j in range( 0, 100 ):
dict[i] = dict.get( i, [] ).append( j )
然而,当我尝试上面的代码时,我没有例外,但我的列表最终如下:
AttributeError:'NoneType'对象没有属性'append'
列表有一个追加方法,所以我将测试简化为以下内容:
dict = {}
for i in range( 0, 10 ):
dict[i] = dict.get( i, [] ).append( i )
输出如下:
{0:无,1:无,2:无,3:无,4:无,5:无,6:无,7:无,8:无,9:无}
所以我的问题是为什么dict.get(i,[])默认返回None而不是[]?做dict.get(i,list())有同样的问题,所以我有点难过。
答案 0 :(得分:18)
要解决此问题,您需要使用Python的defaultdict
。
http://docs.python.org/library/collections.html#defaultdict-examples
from collections import defaultdict
dict = defaultdict(list)
for i in range( 0, 10 ):
for j in range( 0, 100 ):
dict[i].append( j )
答案 1 :(得分:16)
dict.get( i, [] )
不是None
,而是append
。dict.setdefault(i, []).append(j)
。您可能希望使用defaultdict
或首先使用d = {}
for i in range( 0, 10 ):
for j in range( 0, 100 ):
d.setdefault( i, [] ).append( j )
。
以下是你将如何做到这一点:
dict
请注意,我已将d
更改为dict
,因为dict[i] =
已经意味着Python中的某些内容(您正在重新定义它)并且删除了导致其的多余{{1}}错误信息。
答案 2 :(得分:3)
问题是append
返回None
而不是列表对象。所以
dict[i] = dict.get( i, [] ).append( j )
将{无}分配给dict[i]
但是,你可以做得更简单:
dict.setdefault( i, [] ).append( j )
..引用setdefault
的文档:
如果键在词典中,则返回其值。如果没有,请插入值为default的值并返回默认值
因此,如果键i
尚未存在,则会创建它并将默认值存储在其中,在任何一种情况下它都会返回键值 - 这是对列表的引用,因此您可以直接修改它
答案 3 :(得分:2)
append
不会返回列表。它将值附加到列表并返回None
。
而不是:
dict[i] = dict.get( i, [] ).append( j )
你可以这样做:
dict.setdefault(i, [])
dict[i].append( j )
答案 4 :(得分:1)
通过利用列表添加来使用get
方法的替代方法。
d = {}
for i in range(0, 10):
for j in range(0, 100):
d[i] = d.get(i, []) + [j]