在Python中定义多维字典的最佳方法是什么?

30 投票
4 回答
51131 浏览
提问于 2025-04-15 20:03

我现在正在使用下面的方法来定义一个多维字典(也就是字典里面还有字典)在Python中。我的问题是:这样定义多维字典是最好的方法吗?

from collections import defaultdict

def site_struct(): 
    return defaultdict(board_struct)

def board_struct(): 
    return defaultdict(user_struct)

def user_struct(): 
    return dict(pageviews=0,username='',comments=0)

userdict = defaultdict(site_struct)

我想要得到这样的结构:

userdict['site1']['board1']['username'] = 'tommy'

我还在用这个方法来实时增加用户的计数器,这样就不用每次都检查一个键是否存在或者是否已经是0了。例如:

userdict['site1']['board1']['username']['pageviews'] += 1

4 个回答

1

从我的角度来看,这个问题有点主观。对我来说,真正的问题是你应该在什么时机把这种嵌套的数据结构升级成带有方法的对象,以便让你不受变化的影响。不过,我有时候会创建一些大型的原型命名空间,像下面这样:

from collections import defaultdict

def nesteddict(): 
  return defaultdict(nesteddict)
17

你可以像这样创建一个多维字典,字典里的内容可以是任何类型:

from collections import defaultdict
from collections import Counter

def multi_dimensions(n, type):
  """ Creates an n-dimension dictionary where the n-th dimension is of type 'type'
  """  
  if n<=1:
    return type()
  return defaultdict(lambda:multi_dimensions(n-1, type))

>>> m = multi_dimensions(5, Counter)
>>> m['d1']['d2']['d3']['d4']
Counter()
45

元组是可以被哈希的。可能我没有理解到重点,但为什么不使用一个标准的字典,并约定键是三元组呢?比如说:

userdict = {}
userdict[('site1', 'board1', 'username')] = 'tommy'

撰写回答