Sau*_*abh 40 python dictionary
我需要在python中创建一个二维字典.例如new_dic[1][2] = 5
当我做new_dic = {},并尝试插入值,我得到一个KeyError:
new_dic[1][2] = 5
KeyError: 1
Run Code Online (Sandbox Code Playgroud)
这该怎么做?
Mar*_*ers 56
多维字典只是一个字典,其中值本身也是字典,创建嵌套结构:
new_dic = {}
new_dic[1] = {}
new_dic[1][2] = 5
Run Code Online (Sandbox Code Playgroud)
但是,您必须检测到new_dic[1]每次都已创建,以免意外擦除该嵌套对象以获取其他键new_dic[1].
您可以使用各种技术简化创建嵌套字典; 使用dict.setdefault()例如:
new_dic.setdefault(1, {})[2] = 5
Run Code Online (Sandbox Code Playgroud)
dict.setdefault() 如果密钥仍然缺失,则只会将密钥设置为默认值,从而使您不必每次都进行测试.
更简单的是使用该collections.defaultdict()类型自动创建嵌套字典:
from collections import defaultdict
new_dic = defaultdict(dict)
new_dic[1][2] = 5
Run Code Online (Sandbox Code Playgroud)
defaultdict这里只是标准dict类型的子类; 每次尝试访问映射中尚不存在的键时,都会调用工厂函数来创建新值.这是dict()可调用的,它在调用时产生一个空字典.
演示:
>>> new_dic_plain = {}
>>> new_dic_plain[1] = {}
>>> new_dic_plain[1][2] = 5
>>> new_dic_plain
{1: {2: 5}}
>>> new_dic_setdefault = {}
>>> new_dic_setdefault.setdefault(1, {})[2] = 5
>>> new_dic_setdefault
{1: {2: 5}}
>>> from collections import defaultdict
>>> new_dic_defaultdict = defaultdict(dict)
>>> new_dic_defaultdict[1][2] = 5
>>> new_dic_defaultdict
defaultdict(<type 'dict'>, {1: {2: 5}})
Run Code Online (Sandbox Code Playgroud)
Fan*_*ohn 19
看看这个:
def nested_dict(n, type):
if n == 1:
return defaultdict(type)
else:
return defaultdict(lambda: nested_dict(n-1, type))
Run Code Online (Sandbox Code Playgroud)
然后:
new_dict = nested_dict(2, float)
Run Code Online (Sandbox Code Playgroud)
现在你可以:
new_dict['key1']['key2'] += 5
Run Code Online (Sandbox Code Playgroud)
您可以根据需要创建任意数量的维度,具有您选择的目标类型:
new_dict = nested_dict(3, list)
new_dict['a']['b']['c'].append(5)
Run Code Online (Sandbox Code Playgroud)
结果将是:
new_dict['a']['b']['c'] = [5]
Run Code Online (Sandbox Code Playgroud)
一种简单的方法是仅使用元组作为常规字典的键。所以你的例子变成了这样:
new_dic[(1, 2)] = 5
缺点是所有的用法都必须遵循这个有点尴尬的约定,但如果没问题,这就是你所需要的。
你可以试试这个,如果是字符串就更容易了
new_dic = {}
a = 1
new_dic[a] = {}
b = 2
new_dic[a][b] = {}
c = 5
new_dic[a][b]={c}
Run Code Online (Sandbox Code Playgroud)
类型
new_dic[a][b]
>>>'5'
Run Code Online (Sandbox Code Playgroud)
对于字符串
new_dic = {}
a = "cat"
new_dic[a] = {}
b = "dog"
new_dic[a][b] = {}
c = 5
new_dic[a][b] = {c}
Run Code Online (Sandbox Code Playgroud)
类型
new_dic["cat"]["dog"]
>>>'5'
Run Code Online (Sandbox Code Playgroud)
简单来说,您可以使用 defaultdict
from collections import defaultdict
new_dic = defaultdict(dict)
new_dic[1][2]=5
>>>new_dic
defaultdict(<type 'dict'>, {1: {2: 5}})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
70946 次 |
| 最近记录: |