我有一个空数组。
我想分配一个这样的值:array[key][subkey] = 'value'
这会产生 KeyError ,因为数组[key]尚不存在。
我该怎么办?我试过以下......
array['key'] = None
array['key']['subkey'] = 'value'
TypeError:'NoneType'对象不支持项目分配
我试过了:
array['key'] = []
array['key']['subkey'] = 'value'
TypeError:list indices必须是整数,而不是str
我试过了:
array['key'] = ['subkey']
array['key']['subkey'] = 'value'
TypeError:list indices必须是整数,而不是str
那我该怎么办?
答案 0 :(得分:12)
您可以使用here,将默认工厂作为dict
传递:
>>> from collections import defaultdict
>>> d = defaultdict(dict)
>>> d['key']['subkey'] = 'value'
>>> d
defaultdict(<type 'dict'>, {'key': {'subkey': 'value'}})
要应用更多级别的嵌套,您可以创建一个defaultdict
,使用函数(最好是匿名函数)将defaultdict
返回到第n 个嵌套深度。返回嵌套的默认字典:
>>> d = defaultdict(lambda: defaultdict(dict))
>>> d['key']['subkey']['subsubkey'] = 'value'
>>> d
defaultdict(<function <lambda> at 0x104082398>, {'key': defaultdict(<type 'dict'>, {'subkey': {'subsubkey': 'value'}})})
示例显示嵌套深度n=1
答案 1 :(得分:5)
您使用的是[]
列表文字而不是{}
字典文字:
array['key'] = {}
array['key']['subkey'] = 'value'
但这在循环中不是很有用
在一个循环中,您可以测试'key'
是否不在array
- 这是一个便宜的操作(O(1)
查找):
if 'key' not in array:
array['key'] = {}
array['key']['subkey'] = 'value'
但您可以使用setdefault()
执行相同的操作,并为key
提供默认值(如果它还没有值),例如:
array.setdefault('key', {})['subkey'] = 'value'
如果这看起来很难看,那么你总是可以使用collection.defaultdict
。
答案 2 :(得分:3)
我之前使用过这种替代方式(编辑:虽然我更喜欢Moses Koledoye回答):
array = {}
try:
array[key][subkey] = 'value'
except KeyError:
array[key] = {}
array[key][subkey] = 'value'
答案 3 :(得分:3)
你可以像这样使用嵌套的defaultdict
,自动任意深度:
>>> from collections import defaultdict
>>> def ndd():
return defaultdict(ndd)
>>> array = ndd()
>>> array['key']['subkey']['subsubkey'] = 'value'
>>> array
defaultdict(<function ndd at 0x041AC270>,
{'key': defaultdict(<function ndd at 0x041AC270>,
{'subkey': defaultdict(<function ndd at 0x041AC270>,
{'subsubkey': 'value'})})})
(为了便于阅读,我缩进了输出。)
最初看到from severb。
答案 4 :(得分:0)
以下代码可以用作不同的方法吗?
>>> array = {}
>>> array["key"] = {"subkey": "value"}
>>> array
{'key': {'subkey': 'value'}}
>>>