2011-04-24 66 views
8

在蟒蛇,我想建立使用字典get方法在默认情况下提供一个空列表数组的字典,然后用信息,例如填充:Python:使用Dictionary get方法默认返回空列表返回None!

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

然而,当我尝试上面的代码我没有得到任何异常,但我的名单结束了类似如下:

AttributeError: 'NoneType' object has no attribute 'append'

列表有一个附加的方法,所以我简化我的测试以下:

dict = {} 
for i in range(0, 10): 
    dict[i] = dict.get(i, []).append(i) 

输出功率为以下几点:

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

所以我的问题是,默认情况下,为什么dict.get(I,[])返回无,而不是[]?做dict.get(我,列表())有同样的问题,所以我有点难住。

+4

请不要使用'dict'作为变量名。它与内置的'dict'类相冲突。 – 2011-04-24 17:49:45

+0

我通常不这样做,我只是想清楚变量是什么。 – Danielb 2011-04-24 18:03:07

+0

你不想''dict [i] ='在'setdefault'前面。看到我编辑的答案。 – Gabe 2011-04-24 18:14:28

回答

14

这不是dict.get(i, [])这是返回None,这是append。您可能首先需要使用dict.setdefault(i, []).append(j)或仅使用defaultdict

这里是你会怎么做:因为dict已经意味着在Python的东西(你重新定义它),我去掉了多余dict[i] =这是造成错误

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

注意,我改变dictd信息。

14

要解决此问题,您需要使用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) 
+0

这是正确的答案。在Python中没有奖励积分“滚动你自己”。 – jwg 2015-05-26 07:37:35

2

append不返回一个列表。它将值附加到列表中并返回None

取而代之的是:

dict[i] = dict.get(i, []).append(j) 

你可以这样做:

dict.setdefault(i, []) 
dict[i].append(j) 
+1

或者在一行中:'dict.setdefault(i,[ ])。append(j)' - 尽管需要注意的是defaultdict更快。 – 2011-04-24 18:17:27

3

的问题是,append回报None,而不是列表对象。所以

dict[i] = dict.get(i, []).append(j)没有分配到dict[i]

但是,你可以做简单得多:

dict.setdefault(i, []).append(j) 

..引用的文档为setdefault

If key is in the dictionary, return its value. If not, insert key with a value of default and return default

因此,如果关键i是尚未出现它创建它并在其中存储默认值,在任何情况下它都会返回键值 - 哪一个我是对列表的引用,所以你可以直接修改它。

+0

在同一行上执行append和setdefault会导致Python 2.7.1中的异常。 – Danielb 2011-04-24 18:14:24

+0

适用于2.6和3.1的我 – 2011-04-24 18:21:16

0

通过利用列表添加使用get方法的替代方法。

d = {} 
for i in range(0, 10): 
    for j in range(0, 100): 
     d[i] = d.get(i, []) + [j] 
+0

问题是这需要先从'j'中创建一个元素列表以利用它。 – martineau 2015-07-01 18:41:29