【问题标题】:Best way to define multidimensional dictionaries in python? [duplicate]在python中定义多维字典的最佳方法? [复制]
【发布时间】:2011-01-24 04:52:28
【问题描述】:

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

【问题讨论】:

  • 此代码不会运行 in python 解释器。这让你很难理解你想要做什么。

标签: python data-structures dictionary


【解决方案1】:

元组是可散列的。可能我错过了重点,但你为什么不使用标准字典,约定键是三元组呢?例如:

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

【讨论】:

  • 我推荐这种方法,除非您需要将 userdict['site1'] 传递给某些函数。
  • 这很有效,只要你不需要列出'site1'下的所有板子条目。
  • 使用这种方法我将无法做类似的事情.. userdict[('site1', 'board1', 'user1', 'pageviews)] += 1
  • 而且你不需要括号:userdict['site1', 'board1', 'username'] = 'tommy'.
  • 您不能使用元组方法迭代单个维度。
【解决方案2】:

您可以像这样创建任何类型的多维字典:

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

【讨论】:

  • 当我尝试这个时,我得到TypeError: Required argument 'name' (pos 1) not found,它指的是return type()这一行。
  • 我发现了我的问题 - 这只是我定义“N 维”字典的方式与上面定义的方式之间的区别。例如。单个基准由 0 维索引。一个简单的数组以 1 暗作为索引。数组数组中的 vals 由 2 个维度索引。字典只是由字符串索引的数组。它拥有的 vals 不是(对我而言)一个额外的维度,尽管我知道你怎么能这样想。在上面的示例中,我会称它为 4D 字典,而不是 5。所以我的代码无法正常工作,因为我期待的是类型而不是 dict @ 1 维的字典。
【解决方案3】:

从我的角度来看,这是一个非常主观的问题。对我来说,真正的问题是,您在什么时候将这种嵌套数据结构推广到具有使您免受更改影响的方法的对象。但是,众所周知,我会使用以下内容创建大型原型命名空间:

from collections import defaultdict

def nesteddict(): 
  return defaultdict(nesteddict)

【讨论】:

  • 此解决方案保留了迭代维度的能力,但确实为 nesteddict 创建了依赖项。
【解决方案4】:

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

我认为您的最终目标是创建一个“多列”数据结构,以便您可以为特定对象(在本例中为 站点)存储任意数量的属性。创建一个站点类将完成此操作,然后您可以将实例粘贴到任何其他对象(变量)的任何位置 - 有一些值得注意的例外。

【讨论】:

    猜你喜欢
    • 2016-06-17
    • 1970-01-01
    • 2012-01-15
    • 2014-01-14
    • 2017-04-16
    • 2014-08-23
    • 1970-01-01
    • 2015-07-03
    • 2015-05-26
    相关资源
    最近更新 更多