2013-10-03 47 views
-2

我有不同的類型的字典:自動化問題

p1 = {'pair1': ([2, 3, 4], [5, 6, 7])} 
    p2 = {'pair2': ([9, 10, 11], [12, 13, 14])} 
    p3 = {'pair3': ([12, 20, 30], [17, 8, 30])} 

我想計算(與保存的結果):

p1['mean']=np.mean(p1['pair1']) 
    print p1 
    {'pair1': ([2, 3, 4], [5, 6, 7]), 'mean': 4.5} 

我想定義誰計算平均值爲每pair1功能,pair2,pair3,pair4並保存結果。

獲得的結果並不難,我想結果保存在每個字典..試過好幾個小時,從來沒有做過

+0

還有,你試過這麼遠嗎?它是如何工作的?它做了什麼呢?你有錯誤嗎?發佈*完整*追蹤。 –

+0

*嘗試了幾個小時,從未工作* ...幾個小時?真?奇怪它不工作...(對不起,你要求它;)) –

回答

0

與問題的問題,因爲它是目前寫的是,有沒有辦法一個函數知道密鑰名稱pair1,因爲這對於每個字典都是不同的。

你可以使用一個一致的鍵名狀pair每一個字典:

p1 = {'pair': ([2, 3, 4], [5, 6, 7])} 
p2 = {'pair': ([9, 10, 11], [12, 13, 14])} 
p3 = {'pair': ([12, 20, 30], [17, 8, 30])} 

def find_and_set_mean(a_dictionary): 
    a_dictionary['mean']=np.mean(a_dictionary['pair']) 

find_and_set_mean(p1) 
find_and_set_mean(p2) 
find_and_set_mean(p3) 

這給:

{'pair': ([2, 3, 4], [5, 6, 7]), 'mean': 4.5} 
{'pair': ([9, 10, 11], [12, 13, 14]), 'mean': 11.5} 
{'pair': ([12, 20, 30], [17, 8, 30]), 'mean': 19.5} 

但是一個更好的解決方案可能是組織這次作爲一個對象:

class PairObject(object): 

    def __init__(self, _part1, _part2): 
     self.part1 = _part1 
     self.part2 = _part2 

    def pair(self): 
     return (self.part1, self.part2) 

    def mean(self): 
     return np.mean((self.part1, self.part2)) 

# Then use it like this:  
p1 = PairObject([2, 3, 4], [5, 6, 7]) 
p1.pair() # returns ([2, 3, 4], [5, 6, 7]) 
p1.mean() # returns 4.5 
+0

謝謝!你將如何組織代碼?我有50對,我需要在這些對上應用20個函數,並將函數的結果自動添加到相應的對,例如平均值,相關性,滾動關聯等。您是否願意像這樣工作? 'pair =''pair1':([2,3,4],[5,6,7]),'pair2':([9,10,11],[12,13,14]),'pair3 ':([5,9,10],[8,9,2])}' – user21988

+0

我在上面添加了一個對象的例子。將太多數據結構嵌套在一起的問題在於,難以記住如何訪問數字並且難以調試。您可以像上例中那樣將相關性編程爲類函數。 您仍然可以將對象存儲在如下字典中: pairs ['pair5'] = PairObject([3,5],[7,8])) – Justin

+0

@ user21988如果您有許多類似的對象需要以相同的方式處理,首先想到的是使用列表並將處理應用於其所有元素。如果您需要通過名稱訪問單個對象,則可以將它們放入類似您所給示例的字典中;但如果你的密鑰都是'pair [n]'的格式,那麼使用列表和通過它們的索引訪問元素就沒有區別...... – l4mpi

0

我想詳細介紹一下Justin的OO解決方案:

def mean (self)的問題在於,每次訪問時都會重新計算。你會想讓這個屬性很懶,也就是說,當它第一次被訪問並存儲它以供將來參考時,它會進行計算。

事情是這樣的:

class PairObject: 
    def __init__(self, part1, part2): 
     self._pair = (part1, part2) 
     self._mean = None 

    @property 
    def pair(self): 
     return self._pair 

    @property 
    def mean(self): 
     if self._mean == None: self._mean = np.mean(self._pair) 
     #explicit test for None, as e.g. a mean of 0 also is falsy 
     return self._mean 

# Then use it like this:  
pairs = [PairObject ([2, 3, 4], [5, 6, 7]), 
    PairObject ([9, 10, 11], [12, 13, 14]), 
    PairObject ([12, 20, 30], [17, 8, 30]) ] 

for p in pairs: 
    print p.pair 
    print p.mean