【发布时间】:2013-07-19 07:46:27
【问题描述】:
我的 Python 代码如下所示:
if key in dict:
dict[key].append(some_value)
else:
dict[key] = [some_value]
但我认为应该有一些方法可以绕过这个“if”语句。我试过了:
dict.setdefault(key, [])
dict[key].append(some_value)
和
dict[key] = dict.get(key, []).append(some_value)
但两者都抱怨“TypeError: unhashable type: 'list'”。有什么建议吗?
【问题讨论】:
-
看起来您可能在使用列表键时遇到问题,与整个默认值无关。那,或者您不小心在实际代码中切换了一些参数,而您在将其发布到 SO 时没有这样做。
-
您的异常与您在此处发布的代码无关。这表明
key是一个列表对象,它不是可散列的,因此不允许作为字典键。 -
除了 Martijn 对设置默认值的回答之外,您还遇到了使用 python 类名作为变量名的问题。当你说
dict.setdefault(key, [])时,你实际上是在调用'dict' 类对象上的未绑定的setdefault 方法。它将“key”视为自身指针并尝试使用“[]”作为索引。只需创建您自己的变量mydict = dict(),您就会走得更远。 -
@tdelaney:从帖子的其余部分,我推测 OP 在某些时候已经完成了
dict = {}。一个坏主意,因为它 masks 内置。如果dict仍然是内置的,则例外情况完全不同:TypeError: descriptor 'setdefault' requires a 'dict' object but received a 'str'(对于key中的str值)。 -
哦,哇。我犯了大错。我没有意识到我通过写
dict = {}掩盖了一个内置函数。我的错。谢谢!
标签: python dictionary default-value