0

測定値からの複数のベクトルを持つクラスがあります。これらのベクトルを反復処理する必要がありますが、選択した測定値のみを使用したいと考えています。これまでに構築したものの簡略化されたバージョンは以下のとおりです。

import pylab as pl
class IterationReturn(object):
    def __init__(self):
        self.a = (1,2,3,4,5,6,7,8,9)
        self.b = (10,20,30,40,50,60,70,80,90)
        self.c = (-1,-2,-3,-4,-5,-6,-7,-8,-9)
        self.i = 0

    def returnNextSet(self):
        self.aIter = self.a[self.i]
        self.bIter = self.b[self.i]
        self.cIter = self.c[self.i]
        self.i +=1
        return (self.aIter, self.bIter, self.cIter)               

if __name__ == '__main__':
    iteration = IterationReturn()
    for i in range(len(iteration.a)): 
        # x takes aIter value from iteration.returnNextSet()
        # y takes bIter value from iteration.returnNextSet()        
        x,y = iteration.returnNextSet()    
        pl.scatter(x, y)
    pl.show()

この例ではどちらが機能するかは使用したくありませんx,y,z = iteration.returnNextSet()が、実際にはもっと多くの値があり、それらすべてを割り当てたくありません。aIterとだけに割り当てる方法が見つかりませんbIter

エラーがあります:

    x,y = iteration.returnNextSet()      
ValueError: too many values to unpack

私の問題では、多くの測定値 (a、b、...、z) があり、たとえば、x=d と y=k を割り当てたいと考えています。新しいクラスを設計するなど、最初から別の方法で行う必要があると思います。継承ですが、その方法がわかりません。助けていただければ幸いです

4

3 に答える 3

1

これを行う最善の方法は、辞書を返すことです。

return {'a': self.aIter, 'b':self.bIter, 'c': self.cIter, ...}

次に、次を割り当てることができます。

NS = iteration.returnNextSet()
x, y = NS['x'], NS['y']

.

現在の関数を維持して、最初の 2 つの値を割り当てることができます。

x, y = iteration.returnNextSet()[:2]

Python 3 では、残りの値を別のタプルに割り当てることができます。

x, y, *args = iteration.returnNextSet()
于 2012-10-20T14:03:52.923 に答える
1

なぜこれを行う必要があるのか​​ よくわかりませんが、1つの方法を次に示します。

class Test(object):
    def __init__(self):
        self.a = (1,2,3,4,5,6,7,8,9)
        self.b = (10,20,30,40,50,60,70,80,90)
        self.c = (-1,-2,-3,-4,-5,-6,-7,-8,-9)

    def iter_over(self, *args):
        items = [getattr(self, arg) for arg in args]
        return zip(*items)

t = Test()
for a, c in t.iter_over('a', 'c'):
    print a, c

1 -1
2 -2
3 -3
4 -4
5 -5
6 -6
7 -7
8 -8
9 -9

または:

for items in t.iter_over('c', 'b', 'a'):
    print items[1] # will be b (or 2nd passed above) etc...
于 2012-10-20T14:07:53.643 に答える