Python:默认使用Dictionary get方法返回空列表返回None!

时间:2011-04-24 17:43:23

标签: python list dictionary

在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())有同样的问题,所以我有点难过。

5 个答案:

答案 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,而是appenddict.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]