在python中声明一个多维字典

时间:2015-03-30 14:06:50

标签: python dictionary

我需要在python中创建一个二维字典。例如new_dic[1][2] = 5

当我制作new_dic = {}并尝试插入值时,我得到KeyError

new_dic[1][2] = 5
KeyError: 1

怎么做?

8 个答案:

答案 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