2012-02-26 126 views
2

我运行了几次具有不同输入参数的应用程序,以收集执行时间。Python:多维字典

的输入参数为6:vnmbpc

概念我觉得我的结果多维数组,其中的任何尺寸是不同的参数:times[A][B][C][D][E][F]将包含使用参数v=An=Bm=Cb=Dp=Ec=F仿真的执行时间。

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

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

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

我想使用字典做整个事情的字典的字典的字典的字典的字典,每个执行时间将这样表示:

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

但这种方法不看优雅:构建整个结构并迭代它是一种痛苦。

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

+0

你可以通过参数的元组来存储它,所以你做'次[A,B,C,D,E,F]' – 2012-02-26 15:14:38

+0

@Thomas:用元组字典我不能修复一些变量和迭代其他:'for n in times [v]:print(times [v] [n] [m] [b] [p] [c])' – peoro 2012-02-26 15:19:47

回答

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) 
+0

是的,我没有明白开始,谢谢澄清! 我仍然唯一的问题是,我不能使用'range()'来为输入参数生成值,因为它们很稀疏,我不知道静态值是什么。有什么方法可以生成所有且仅存在于我的元组的第i个元素中的值? (即:'itertools.product([0],[2],elements_present_in_3rd_field_of_my_dict_keys)') – peoro 2012-02-26 15:26:56

+0

@peoro,好吧,我想我需要更多地了解你正在做什么来回答这个问题。所有现有密钥的列表很容易获得:只需遍历字典,如果要按顺序键排序。你所说的问题并不适用于将值插入字典中。在什么样的用例中,你只需要遍历字典中的那些值,而'sorted(d)'不会给你想要的东西?无论如何,你不必使用'range';你总是可以使用像'(1,5,6,8)'这样的序列。 – senderle 2012-02-26 15:31:38

+0

@peoro,再仔细考虑一下,听起来好像你只想遍历'k [2] == 5'这样的项目。确实,以这种方式查询“行”可能在单字典案件中效率较低。如果是的话,也许你的嵌套字典解决方案对你的用例来说是正确的;这取决于数据的动态性。实际上,上述内容使得创建和插入操作非常简单和快速,但是使某些类型的查询更困难并且可能更慢。尽管如此,你总是可以迭代键并过滤它们。这是否会比嵌套方法减慢更多取决于您的数据。 – senderle 2012-02-26 15:45:09

1

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

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

这确实会更简单一些,但我无法修复某些值并重复其他值 - 除非使用senderle建议的'itertools.product'之类的东西。 – peoro 2012-02-26 15:27:51