2014-04-09 75 views
2

我從另一個類可以循環通過多個不同大小的Python字典

>>> print init_treats 
{('001', 0): init_treat_001_0, ('001', 3): init_treat_001_3, ('001', 2): init_treat_001_2, ('002', 0): init_treat_002_0, ('002', 1): init_treat_002_1, ('002', 2): init_treat_002_2, ('002', 3): init_treat_002_3, ('001', 1): init_treat_001_1} 

>>> print init_untreats 
{'002': init_untreat_002, '001': init_untreat_001} 

我怎樣才能生成以下繼承以下兩個Python字典?

init_treat_001_0 + init_treat_001_1 + init_treat_001_2 + init_treat_001_3 + 
init_untreat_001 == 0 


init_treat_002_0 + init_treat_002_1 + init_treat_002_2 + init_treat_002_3 + 
init_untreat_002 == 0 
+0

你的意思是你想用'init_untreats'中的鍵匹配'init_treats.keys().. [0]'(元組鍵中的第一個元素)? –

+0

@MartijnPieters是的,爲了開發下面的公式。這是一個優化問題,我正在嘗試爲 – dassouki

回答

2

排序您init_treats鍵:

treats = sorted(init_treats) 

現在你可以使用itertools.groupby()將它們分組對你的關鍵的第一部分:

from itertools import groupby 
from operator import itemgetter 

for untreat, group in groupby(sorted(init_treats), itemgetter(0)): 
    # group is now a sorted iterator of keys with the same first value 
    if init_untreat[untreat] + sum(map(init_treats.get, group)) == 0: 
     # sum of init_treat_n_m + init_untreat_n is 0 

由於這種使用排序,這是一個O(NlogN)解決方案(N是init_treats字典的大小)

你可以用字典查一個O(N + K)溶液(K爲init_untreats字典的大小):

sums = init_untreat.copy() 
for untreat, id in init_treats: 
    sums[untreat] += init_treats[untreat, id] 

for untreat, total in sums.items(): # use sums.iteritems() in Python 2 
    if total == 0: 
     # sum of init_treat_n_m + init_untreat_n is 0 

因爲K是在你的情況下N多始終較小,漸進地說,這是一個O(N)算法,當然。

+0

開發方程式感謝您的解決方案。在你的第二部分中,似乎總和[untreats](對於n + 1)超越了(n)的總和[unreatreats]的結果。或者我看着這個錯誤?當我介入並觀察[治療]正在逐步完成的結果時,我發現最終結果是兩個方程式。當我退出循環時,返回結果[treat]我只得到一個。 – dassouki

+1

@dassouki:'sums'通過'untreat'鍵組合總和。因此對於'init_treats'字典中的所有'(untreat,id)'鍵,它們的值在鍵的'untreat'部分被分組在一起。如果你有兩個不同的'不需要'的密鑰,你會在該字典中得到兩筆金額。 –

+0

謝謝,完美:) – dassouki