2012-02-26 135 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