我需要在python中创建一个二维字典。例如new_dic[1][2] = 5
当我制作new_dic = {}
并尝试插入值时,我得到KeyError
:
new_dic[1][2] = 5
KeyError: 1
怎么做?
答案 0 :(得分:50)
多维字典只是一个字典,其中值本身也是字典,创建嵌套结构:
new_dic = {}
new_dic[1] = {}
new_dic[1][2] = 5
但是,每次都必须检测到您已创建new_dic[1]
,以免意外擦除{嵌顿对象以获取new_dic[1]
下的其他键。
您可以使用各种技术简化嵌套词典的创建;使用dict.setdefault()
例如:
new_dic.setdefault(1, {})[2] = 5
如果密钥仍然缺失, dict.setdefault()
只会将密钥设置为默认值,从而使您不必每次都进行测试。
更简单仍然是使用collections.defaultdict()
type自动创建嵌套词典:
from collections import defaultdict
new_dic = defaultdict(dict)
new_dic[1][2] = 5
defaultdict
只是此处标准dict
类型的子类;每次尝试访问映射中尚不存在的键时,都会调用工厂函数来创建新值。这就是dict()
callable,它在调用时产生一个空字典。
演示:
>>> 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}})
答案 1 :(得分:17)
检查出来:
def nested_dict(n, type):
if n == 1:
return defaultdict(type)
else:
return defaultdict(lambda: nested_dict(n-1, type))
然后:
new_dict = nested_dict(2, float)
现在你可以:
new_dict['key1']['key2'] += 5
您可以根据需要创建任意数量的维度,具有您选择的目标类型:
new_dict = nested_dict(3, list)
new_dict['a']['b']['c'].append(5)
结果将是:
new_dict['a']['b']['c'] = [5]
答案 2 :(得分:4)
简单地说,您可以使用defaultdict
from collections import defaultdict
new_dic = defaultdict(dict)
new_dic[1][2]=5
>>>new_dic
defaultdict(<type 'dict'>, {1: {2: 5}})
答案 3 :(得分:2)
这是一个字典,其中包含另一个字典作为键1的值:
>>> new_dic = {}
>>> new_dic[1] = {2:5}
>>> new_dic
{1: {2: 5}}
你遇到的问题
new_dic={}
new_dic[1][2]=5
是new_dic[1]
不存在,因此您无法为其添加字典(或任何相关内容)。
答案 4 :(得分:2)
一种简单的方法是仅将元组用作常规字典的键。因此,您的示例变为:
new_dic[(1, 2)] = 5
不利之处在于,所有用法都必须遵循这种稍显尴尬的约定,但是如果可以的话,这就是您所需要的。
答案 5 :(得分:1)
您的意思是dict
还是list
?
如果您的意思是dict
,您希望第二级是另一级dict
吗?还是list
?
要使dict
工作,您需要提前声明密钥。
所以,如果它dicts
dicts
你需要这样的话:
new_dic = {}
try:
new_dic[1][2] = 5
except KeyError:
new_dic[1] = {2:5}
答案 6 :(得分:1)
你可以试试这个,如果它是字符串
就更容易了new_dic = {}
a = 1
new_dic[a] = {}
b = 2
new_dic[a][b] = {}
c = 5
new_dic[a][b]={c}
输入
new_dic[a][b]
>>>'5'
对于字符串
new_dic = {}
a = "cat"
new_dic[a] = {}
b = "dog"
new_dic[a][b] = {}
c = 5
new_dic[a][b] = {c}
型
new_dic["cat"]["dog"]
>>>'5'
答案 7 :(得分:-1)
对于项目,我需要类实例的2D dict,其中indees是浮点数(坐标)。我所做的是使用默认字典创建2D字典,并将我的类名作为类型传递。例如:
class myCoordinates:
def __init__(self, args)
self.x = args[0]
self.y = args[1]
,然后当我尝试创建字典时:
table = mult_dim_dict(2, myCoordinates, (30, 30))
其中函数“ mult_dim_dict”定义为:
def mult_dim_dict(dim, dict_type, params):
if dim == 1:
if params is not None:
return defaultdict(lambda: dict_type(params))
else:
return defaultdict(dict_type)
else:
return defaultdict(lambda: mult_dim_dict(dim - 1, dict_type, params))
注意:您不能传递多个参数,而可以传递包含所有参数的元组。如果您的类在创建时不需要传递任何变量,则函数的第三个参数将为None
:
class myCoors:
def __init__(self):
self.x = 0
self.y = 0
def printCoors(self):
print("x = %d, y = %d" %(self.x, self.y))
def mult_dim_dict(dim, dict_type, params):
if dim == 1:
if params is not None:
return defaultdict(lambda: dict_type(params))
else:
return defaultdict(dict_type)
else:
return defaultdict(lambda: mult_dim_dict(dim - 1, dict_type, params))
coor = 30, 20
dict = mult_dim_dict(2, myCoors, None)
dict['3']['2'].x = 3
dict['3']['2'].y = 2
dict['3']['2'].printCoors() #x = 3, y = 2 will be printed