python字典嵌套

Python字典嵌套字典 - blueattack - 博客园

Python字典嵌套字典 - blueattack - 博客园

from collections import defaultdict

mm = defaultdict(lambda :defaultdict(defaultdict))

mm[1][2][3] = 4 

其实像上面那样做仍然不完美,比如上面的代码,如果写:

nn = defaultdict(lambda :defaultdict(defaultdict))
nn[1][2][3][4] = 5
Traceback (most recent call last):
  File "C:\Users\Administrator\anaconda3\lib\site-packages\IPython\core\interactiveshell.py", line 3343, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "", line 1, in 
    nn[1][2][3][4] = 5
KeyError: 3

马上就会报错。

当然,为了使字典多一层key,可以这样:

mm =defaultdict(lambda: defaultdict(lambda :defaultdict(defaultdict)))

这样就可以这样写了:

mm[1][2][3][4] = 5 

但是如果实际编程的时候,需要更多一层key,又会报错。

而且可以看出,在定义mm的时候,有多少个defaultdict,就最多可以有多少层key

那么有没有办法让mm的key的层数尽可能多一些,满足工作需求呢? 可以用以下办法实现:

mm = defaultdict(defaultdict)
for i in range(100):
   ...:    mm = defaultdict(lambda:mm)
   ...:    pass
   ...:
mm[1][2][3][4][5][6][7] = 8

这个例子中,循环了100次,一共有102个defaultdict,也就是说mm可以有102层key。

肯定满足需要了。

如果有需要,还可以封装成一个函数

不过,还是感觉没有perl的哈希简单,可以无限嵌套。

def nest(number):
    mm = defaultdict(defaultdict)
    for i in range(number):
        mm = defaultdict(lambda:mm)
    return(mm)

但是看看这个,会让人有些崩溃:

aa = nest(100)
aa[1][2] = 'A'
aa[3][4] = 'B'
aa.keys()
Out[192]: dict_keys([1, 2, 3, 4])
for i in aa.keys():
    ...:    print(i)
    ...:    
1
2
3
4

我的意思,本来是想用第一层的keys,也就是1,3,没想到1,2,3,4都是keys

还可以试试:

mm = nest(100)
    ...:mm[1][2][3] = 'A'
    ...:mm[4][5][6] = 'B'
    ...:for i in mm:
    ...:    for j in mm[i]:
    ...:        for k in mm[i][j]:
    ...:            print('{}=={}=={}'.format(i,j,k))

输出的结果简直是disaster 

以下这个办法似乎管用

class Vividict(dict):
    def __missing__(self, key):
        value = self[key] = type(self)() # retain local pointer to value
        return value                     # faster to return than 
                                         # ...'dict lookup'

ydata = Vividict()
aa = Vividict()
aa[1][2][3][4] = 5
aa[5][6][7][8] = 'B'


for i in aa:
    ...:    for j in aa[i]:
    ...:        for k in aa[i][j]:
    ...:            for l in aa[i][j][k]:
    ...:                print('={}==={}====={}====={}='.format(i,j,k,l))
    ...:                
=1===2=====3=====4=
=5===6=====7=====8=

你可能感兴趣的:(python,python)