在python中定义多维字典的最佳方法?

时间:2010-03-05 16:35:28

标签: python data-structures dictionary

我目前正在使用下面的方法在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。 E.g:

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

4 个答案:

答案 0 :(得分:45)

元组是可以清洗的。可能我错过了这一点,但是你为什么不使用一个标准的字典,其中的键将是三元组的约定?例如:

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

答案 1 :(得分:16)

您可以创建任何类型的多维字典,如下所示:

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()

答案 2 :(得分:1)

从我的角度来看,这是一个非常主观的问题。对我来说,真正的问题是你在什么时候将这种嵌套数据结构推广到对象,并使用方法将你与变化隔离开来。但是,我已经知道使用以下内容创建大型原型命名空间:

from collections import defaultdict

def nesteddict(): 
  return defaultdict(nesteddict)

答案 3 :(得分:1)

这是非常主观的 - 但是如果你的dict深度超过2-n,我会回复创建一个类并定义方法/属性来做你想做的事。

我认为您的最终目标是创建一个“多列”数据结构,以便您可以为特定对象存储任意数量的属性(在本例中为 site )。创建一个站点类可以实现这一点,然后你可以将实例粘贴到任何其他对象(变量)的任何地方 - 除了一些明显的例外。