2022年 11月 5日

python字典嵌套

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

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

from collections import defaultdict

mm = defaultdict(lambda :defaultdict(defaultdict))

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

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

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

马上就会报错。

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

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

这样就可以这样写了:

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

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

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

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

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

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

肯定满足需要了。

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

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

  1. def nest(number):
  2. mm = defaultdict(defaultdict)
  3. for i in range(number):
  4. mm = defaultdict(lambda:mm)
  5. return(mm)

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

  1. aa = nest(100)
  2. aa[1][2] = 'A'
  3. aa[3][4] = 'B'
  4. aa.keys()
  5. Out[192]: dict_keys([1, 2, 3, 4])
  6. for i in aa.keys():
  7. ...: print(i)
  8. ...:
  9. 1
  10. 2
  11. 3
  12. 4

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

还可以试试:

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

输出的结果简直是disaster 

以下这个办法似乎管用

  1. class Vividict(dict):
  2. def __missing__(self, key):
  3. value = self[key] = type(self)() # retain local pointer to value
  4. return value # faster to return than
  5. # ...'dict lookup'
  6. ydata = Vividict()
  1. aa = Vividict()
  2. aa[1][2][3][4] = 5
  3. aa[5][6][7][8] = 'B'
  4. for i in aa:
  5. ...: for j in aa[i]:
  6. ...: for k in aa[i][j]:
  7. ...: for l in aa[i][j][k]:
  8. ...: print('={}==={}====={}====={}='.format(i,j,k,l))
  9. ...:
  10. =1===2=====3=====4=
  11. =5===6=====7=====8=