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

Dan*_*elb 15 python dictionary list

在python中我想建立一个使用字典get方法的数组字典,默认情况下提供一个空列表然后填充信息,例如:

dict = {}
for i in range( 0, 10 ):
    for j in range( 0, 100 ):
        dict[i] = dict.get( i, [] ).append( j )
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试上面的代码时,我没有例外,但我的列表最终如下:

AttributeError:'NoneType'对象没有属性'append'

列表有一个append方法,所以我将我的测试简化为以下内容:

dict = {}
for i in range( 0, 10 ):
    dict[i] = dict.get( i, [] ).append( i )
Run Code Online (Sandbox Code Playgroud)

输出如下:

{0:无,1:无,2:无,3:无,4:无,5:无,6:无,7:无,8:无,9:无}

所以我的问题是为什么dict.get(i,[])默认返回None而不是[]?做dict.get(i,list())有同样的问题,所以我有点难过.

Ste*_*yne 21

要解决这个问题,你需要使用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 )
Run Code Online (Sandbox Code Playgroud)


Gab*_*abe 18

这不是dict.get( i, [] )那个回归None,而是append.你可能想要使用dict.setdefault(i, []).append(j)或者只是首先使用a defaultdict.

这是你如何做到的:

d = {}
for i in range( 0, 10 ):
    for j in range( 0, 100 ):
        d.setdefault( i, [] ).append( j )
Run Code Online (Sandbox Code Playgroud)

请注意,我改为dict,d因为dict已经意味着Python中的东西(你正在重新定义它),我删除了dict[i] =导致错误消息的多余内容.


Ale*_*ler 6

问题是append返回None而不是列表对象。所以

dict[i] = dict.get( i, [] ).append( j )将 None 分配给dict[i]

但是,您可以做得更简单:

dict.setdefault( i, [] ).append( j )
Run Code Online (Sandbox Code Playgroud)

..引用文档setdefault

如果 key 在字典中,则返回它的值。如果不是,则插入具有默认值的键并返回默认值

因此,如果键i尚不存在,它会创建它并在其中存储默认值,无论哪种情况,它都会返回键值 - 这是对列表的引用,因此您可以直接修改它。