自动化问题

时间:2013-10-03 20:03:31

标签: python

我有不同的说法:

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

获得结果并不困难,我想在每个字典中保存结果。试了几个小时,从未工作

2 个答案:

答案 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

答案 1 :(得分: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