我有一个空数组.
我想分配一个像这样的值: array[key][subkey] = 'value'
这会产生KeyError,因为array [key]尚不存在.
我该怎么办?我试过以下......
array['key'] = None
array['key']['subkey'] = 'value'
Run Code Online (Sandbox Code Playgroud)
TypeError:'NoneType'对象不支持项目分配
我试过了:
array['key'] = []
array['key']['subkey'] = 'value'
Run Code Online (Sandbox Code Playgroud)
TypeError:list indices必须是整数,而不是str
我试过了:
array['key'] = ['subkey']
array['key']['subkey'] = 'value'
Run Code Online (Sandbox Code Playgroud)
TypeError:list indices必须是整数,而不是str
那我该怎么办?
Mos*_*oye 16
您可以使用collections.defaultdict,将默认工厂传递为dict:
>>> from collections import defaultdict
>>> d = defaultdict(dict)
>>> d['key']['subkey'] = 'value'
>>> d
defaultdict(<type 'dict'>, {'key': {'subkey': 'value'}})
Run Code Online (Sandbox Code Playgroud)
要应用嵌套的进一步水平,你可以创建一个defaultdict返回defaultdicts到一个第n个嵌套的深度,使用功能,最好是匿名的,返回嵌套默认的字典(S):
>>> d = defaultdict(lambda: defaultdict(dict))
>>> d['key']['subkey']['subsubkey'] = 'value'
>>> d
defaultdict(<function <lambda> at 0x104082398>, {'key': defaultdict(<type 'dict'>, {'subkey': {'subsubkey': 'value'}})})
Run Code Online (Sandbox Code Playgroud)
示例显示了嵌套深度 n=1
您使用的是[]列表文字,而不是{}字典文字:
array['key'] = {}
array['key']['subkey'] = 'value'
Run Code Online (Sandbox Code Playgroud)
但这在循环中并不是很有用.
在循环中,您可以测试是否'key'不在array- 这是一个廉价的操作(O(1)查找):
if 'key' not in array:
array['key'] = {}
array['key']['subkey'] = 'value'
Run Code Online (Sandbox Code Playgroud)
但是,如果它还没有值,你可以使用setdefault()同样的东西并给出key一个默认值,例如:
array.setdefault('key', {})['subkey'] = 'value'
Run Code Online (Sandbox Code Playgroud)
如果这看起来很难看,那么你可以随时使用collection.defaultdict.
| 归档时间: |
|
| 查看次数: |
1795 次 |
| 最近记录: |