-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的平均值并保存结果。

获得结果并不难,我想将结果保存在每个字典中。尝试了几个小时,从未成功

4

2 回答 2

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
于 2013-10-03T20:26:17.773 回答
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
于 2013-10-03T20:45:03.943 回答