Python:多维词典

时间:2012-02-26 15:08:33

标签: python data-structures multidimensional-array

我运行了几次具有不同输入参数的应用程序,以便收集执行时间。

输入参数为6:vnmbpc

从概念上讲,我可以将结果视为一个多维数组,其中任何维度都是不同的参数:times[A][B][C][D][E][F]将包含使用参数v=An=B的模拟执行时间, m=Cb=Dp=Ec=F

我希望能够修复其中一些参数并迭代其他参数:

for A:
  for C:
    for F:
      times[A][0][C][0][0][F]

输入参数值很稀疏,所以我应该使用字典而不是列表。

我正在考虑使用dict dict dict dict dict dict来做整件事,每个执行时间都会这样表示:

times = { A:{ B:{ C:{ D:{ E:{ F:{time} } } } } } }

但是这个解决方案看起来并不优雅:构建整个结构并迭代它是一种痛苦。

有没有更好的方法来处理我的数据?

2 个答案:

答案 0 :(得分:7)

首先,如果你必须使用字典,为什么不创建一个字典,使用元组索引它?其次,使用itertools.product来避免麻烦的嵌套循环:

>>> import itertools
>>> d = {}
>>> for tup in itertools.product(range(5), repeat=2):
...     d[tup] = tup
... 
>>> d
{(1, 3): (1, 3), (3, 0): (3, 0), (2, 1): (2, 1), (0, 3): (0, 3), (4, 0): (4, 0), 
 (1, 2): (1, 2), (3, 3): (3, 3), (4, 4): (4, 4), (2, 2): (2, 2), (4, 1): (4, 1), 
 (1, 1): (1, 1), (3, 2): (3, 2), (0, 0): (0, 0), (0, 4): (0, 4), (1, 4): (1, 4), 
 (2, 3): (2, 3), (4, 2): (4, 2), (1, 0): (1, 0), (0, 1): (0, 1), (3, 1): (3, 1), 
 (2, 4): (2, 4), (2, 0): (2, 0), (4, 3): (4, 3), (3, 4): (3, 4), (0, 2): (0, 2)}

但是,可能有更好的方法来创建稀疏数组。 scipy提供了sparse matrices,但我相信它们只是2-d。

以下是您可能会发现有用的其他一些使用模式:

>>> for tup in itertools.product(range(5), repeat=2):
...     if tup[0] == tup[1]:
...         d[tup] = tup
... 
>>> d
{(3, 3): (3, 3), (0, 0): (0, 0), (1, 1): (1, 1), (4, 4): (4, 4), (2, 2): (2, 2)}

>>> for tup in itertools.product(range(5), range(2)):
...     print d.get(tup)
... 
(0, 0)
None
None
(1, 1)
None
None
None
None
None
None

为了减少倾斜,这里是你如何保持一个变量不变:只需将一个项目序列传递给itertools.product

>>> for tup in itertools.product(range(3), [2], range(3)):
...     print tup
... 
(0, 2, 0)
(0, 2, 1)
(0, 2, 2)
(1, 2, 0)
(1, 2, 1)
(1, 2, 2)
(2, 2, 0)
(2, 2, 1)
(2, 2, 2)

答案 1 :(得分:1)

您可以使用元组内部的参数组合作为键创建一维字典,这样会更简单:

times[('v', 'n', 'm', 'b', 'p', 'c')] = value