Python:使用Dictionary get方法默认返回空列表返回None!
在蟒蛇,我想建立使用字典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(我,列表())有同样的问题,所以我有点难住。
这不是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)
注意,我改变dict
到d
信息。
要解决此问题,您需要使用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)
这是正确的答案。在Python中没有奖励积分“滚动你自己”。 – jwg 2015-05-26 07:37:35
append
不返回一个列表。它将值附加到列表中并返回None
。
取而代之的是:
dict[i] = dict.get(i, []).append(j)
你可以这样做:
dict.setdefault(i, [])
dict[i].append(j)
或者在一行中:'dict.setdefault(i,[ ])。append(j)' - 尽管需要注意的是defaultdict更快。 – 2011-04-24 18:17:27
的问题是,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
是尚未出现它创建它并在其中存储默认值,在任何情况下它都会返回键值 - 哪一个我是对列表的引用,所以你可以直接修改它。
在同一行上执行append和setdefault会导致Python 2.7.1中的异常。 – Danielb 2011-04-24 18:14:24
适用于2.6和3.1的我 – 2011-04-24 18:21:16
通过利用列表添加使用get
方法的替代方法。
d = {}
for i in range(0, 10):
for j in range(0, 100):
d[i] = d.get(i, []) + [j]
问题是这需要先从'j'中创建一个元素列表以利用它。 – martineau 2015-07-01 18:41:29
请不要使用'dict'作为变量名。它与内置的'dict'类相冲突。 – 2011-04-24 17:49:45
我通常不这样做,我只是想清楚变量是什么。 – Danielb 2011-04-24 18:03:07
你不想''dict [i] ='在'setdefault'前面。看到我编辑的答案。 – Gabe 2011-04-24 18:14:28