在重复的python函数中创建列表列表

时间:2018-02-03 14:15:47

标签: python python-3.x

我对python很陌生,特别是在类属性及其工作原理方面。我遇到过这个问题,我有一个函数'builddata',它输出几个整数的列表(Coarsegraining),并将其发送到另一个函数'coarse_grain'。

在粗略的脚本中,这些函数被调用数百次,每次CoarseGraining都不同。我想做的是:

a)每次CoarseGraining达到'coarse_grain'时它都使用该实例,但也将它保存到一个更大的列表中,该函数经过多次重复后,将包含许多这些不同的CoarseGraining配置,然后可以稍后使用。

b)在其他地方定义这个过程,其中CoarseGraining被发送到2个函数,在那里它通过其常规过程中的一个,但是也被配置到这个所谓的列表列表中,然后可以使用它。 / p>

我还要提一下,所有这些函数都在同一个类'MultiFitter'中定义。出于简单的原因,我更喜欢方法a),但任何可能的解决方案都会很棒。以下是我所谈论的一小段摘录。

干杯

class MultiFitter(object):

  def __init__(
    self, models, mopt=None, ratio=False, fast=True, extend=False,
        fitname=None, wavg_svdcut=None, **fitterargs
    ):
    super(MultiFitter, self).__init__()
    models = [models] if isinstance(models, MultiFitterModel) else models
    self.models = models
    self.fit = None         # last fit
    self.ratio = ratio
    self.mopt = mopt
    self.fast = fast
    self.extend = extend
    self.wavg_svdcut = wavg_svdcut       
    self.fitterargs = fitterargs        
    self.fitname = (
        fitname if fitname is not None else
        lambda x : x
        )

  def builddata(self, data=None, pdata=None, prior=None, mf=None):        
    if mf is None:
        mf = self._get_mf()
        mf['flatmodels'] = self.flatten_models(mf['models'])
    if pdata is None:
        if data is None:
            raise ValueError('no data or pdata')
        pdata = gvar.BufferDict()
        for m in mf['flatmodels']:

            M = m.builddata(data)
            CoarseGraining = []
            c1 = 1
            c2 = 0
            for i in range(1, M.shape[0]):                  
                z = gvar.evalcorr([M[c2],M[i]])
                corrValue = z[1][0]                
                if corrValue >= 0.7:
                    c1 = c1 + 1                                              
                    if i == M.shape[0]-1:                            
                        CoarseGraining.append(int(c1))                    
                else:
                    CoarseGraining.append(int(c1))                        
                    c2 = c2 + c1
                    c1 = 1
                    if i == M.shape[0]-1:                            
                        CoarseGraining.append(int(1))            
            pdata[m.datatag] = (
                m.builddata(data) if m.ncg <= 1 else                    
                MultiFitter.coarse_grain(m.builddata(data), CoarseGraining)
                )

  @staticmethod
  def coarse_grain(G, CoarseGraining):

    G = numpy.asarray(G)             
    D = []        
    counter = 0

    for i, ncg in enumerate(CoarseGraining):            
        D.append(str(numpy.sum(G[..., counter:counter + ncg], axis=-1) / ncg))       
        counter = counter + ncg

    D = numpy.asarray(D)
    print(array, 'IS THIS IT???')
    print(D ,'\n')
    #return numpy.transpose([G])
    return G

1 个答案:

答案 0 :(得分:0)

一种方法是使coarse_grain成为class MultiFitter的常规方法,并在您的班级full_list中实例化__init__。然后在coarse_grain方法中附加到列表中。

然后,您可以通过self.full_list访问您的列表列表。

def __init__(...):
    self.full_list = []

def coarse_grain(self, G, CoarseGraining):

    G = numpy.asarray(G)             
    D = []        
    counter = 0

    for i, ncg in enumerate(CoarseGraining):            
        D.append(str(numpy.sum(G[..., counter:counter + ncg], axis=-1) / ncg))       
        counter = counter + ncg

    D = numpy.asarray(D)

    self.full_list.append(D)    

    return G