Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:list()作为字典的默认值_Python_Dictionary_Default Value - Fatal编程技术网

Python:list()作为字典的默认值

Python:list()作为字典的默认值,python,dictionary,default-value,Python,Dictionary,Default Value,我的Python代码如下所示: if key in dict: dict[key].append(some_value) else: dict[key] = [some_value] 但我认为应该有一些方法来绕过这个“如果”语句。我试过了 dict.setdefault(key, []) dict[key].append(some_value) 及 但两人都抱怨“TypeError:unhabable type:'list'”。有什么建议吗?谢谢 最好的方法是使用列表默认值: fro

我的Python代码如下所示:

if key in dict:
  dict[key].append(some_value)
else:
  dict[key] = [some_value]
但我认为应该有一些方法来绕过这个“如果”语句。我试过了

dict.setdefault(key, [])
dict[key].append(some_value)

但两人都抱怨“TypeError:unhabable type:'list'”。有什么建议吗?谢谢

最好的方法是使用
列表
默认值:

from collections import defaultdict
dct = defaultdict(list)
然后使用:

dct[key].append(some_value)
如果密钥尚未在映射中,字典将为您创建一个新列表
collections.defaultdict
dict
的一个子类,其他行为与普通
dict
对象类似

使用标准的
dict
时,
dict.setdefault()
会正确地将
dct[key]
设置为默认值,因此该版本应该可以正常工作。您可以使用
.append()
链接该调用:


但是,通过使用
dct[key]=dct.get(…).append()
dct[key]
的值替换为
.append()
的输出,即
None

,看起来您可能在列表键方面遇到了问题,与整个默认值无关。或者您在实际代码中意外地切换了一些参数,而您在将其发布到中时没有这样做。您的异常与您在此处发布的代码无关。这表明
key
是一个列表对象,它是不可散列的,因此不允许作为字典键。除了Martijn关于设置默认值的回答外,您还遇到了使用python类名作为变量名的问题。当您说
dict.setdefault(key,[])
时,实际上是在调用'dict'类对象上的unbound setdefault方法。它将“key”视为自身指针,并尝试使用“[]”作为索引。只需创建您自己的变量
mydict=dict()
,您将获得进一步的信息。@tdelaney:从文章的其余部分,我推测OP在某个时候已经完成了
dict={}
。这是个坏主意,因为它掩盖了内置的。如果
dict
仍然是,则例外情况是内置的非常不同:
TypeError:描述符“setdefault”需要一个“dict”对象,但收到了一个“str”
(对于
键中的
str
值)。噢,哇。我犯了个大错误。我没有意识到我正在通过编写
dict={}
来屏蔽一个内置函数。我的错。谢谢此解决方案将我的执行时间从2小时缩短到15分钟。我有非常大的字典,当它们达到3000万条时,由于所有的检查键是否已经存在,它们的速度就会减慢。同样值得注意的是,我使用的是networkx图形,但内存开销太大了。现在使用默认字典时,在RAM中加载180GB的图形现在使用默认字典时所需的内存小于20GB。你救了一条命
dct[key].append(some_value)
>>> dct = {}
>>> dct.setdefault('foo', []).append('bar')  # returns None!
>>> dct
{'foo': ['bar']}