2016-08-19 8 views
0

私は、クラス要素のリストに保存する相互依存する変数がたくさんあります。今度はクラスの特徴の1つにしたがってソートされたいと思っています。私はそれに応じて、リストを生成するために、ループのために試してみると以外を使用して、今すぐ一意の機能を持つPythonクラスを作成する

class myclass(object): 
     lst_of_A=[] 
     def __init__(self, Attr_A, Attr_B, Attr_C): 
     self.A=Attr_A 
     self.B=[Attr_B] 
     self.C=[Attr_C] 
     self.lst_of_A.append(Attr_A) 
     def append_to_existing_entry(self, Attr_B, Attr_C): 
     self.B.append(Attr_B) 
     self.C.append(Attr_C) 

:現時点では、私がやっていることはこれです

my_lst_of_classes=[] 
    for el in read_in_data: 
     try: 
     ind=my_lst_of_classes[0].lst_of_A.index(el[0]) 
     my_lst_of_classes[index].append_to_existing_entry(el[1],el[2]) 
     except: 
     my_lst_of_classes.append(myclass(el[0],el[1],el[2])) 

これは動作しますが、非常に不器用なようです。これを行うためのより良い方法はありますか?

+0

少なくとも除いて'置き換える:: 'ValueErrorを除く'によって: 'ここ –

+0

はあなたの問題の私の理解である

ここであなたが始める必要があり、簡単な例を示しますa、b、c) 'を読み込む。それぞれの 'a'(重複あり)の' b'と 'c'値を*グループ化(そして*ソート*しない)したいとします。たとえいくつかの例であなたのコードを実行した後でさえ、事実であるかどうかは不明です説明できますか? –

+0

十分にはっきりしていないことを知らせてください。あなたの理解はほとんど正しいですが、入力は必ずしもタプルではありませんが、私の場合はリストのリストです。私のデータは、例えば、read_in_data [0] [0] = [1,0,1,0,0,0,0]、read_in_data [0] [1] = [0,2,4]、read_in_data [0] [2] = [1,1、-1,1]。次に、read_in_data [1] [0] = [1,0,1,0,0,0,0]、read_in_data [1] [1] = [0,2,6]、read_in_data [1] [2] = [1,1、-1,1]。 (したがって、read_in_data [0] [0] = read_data [1] [0]とread_in_data [0] [2] = read_in_data [1] [2]) – Eulenfuchswiesel

答えて

1

listの代わりにdict(または、ご注文の場合はOrderedDict)を使用します。これにより、読みやすく、より高速なコードが作成されます。

第2点目は、このコレクションの処理(特に「作成または拡張」の部分)をすべてカプセル化して、クライアントコードが気にする必要がないようにすることです。 classmethod(インスタンスではなくクラスを最初の引数として取るメソッド)は、ここにあなたの友人です。 (あなたはタプルのリストを持っている `:

from collections import OrderedDict 

class MyObj(object): 
    _index = OrderedDict() 

    @classmethod 
    def insert(cls, a, b, c): 
     if a in cls._index: 
      cls._index[a].extend(b, c) 
     else: 
      cls._index[a] = cls(a, b, c) 

    @classmethod 
    def list_instances(cls): 
     return cls._index.values() 

    @classmethod 
    def get_instances(cls, key): 
     return cls._index.get(key, []) 


    def __init__(self, a, b, c): 
     self.a = a 
     self.b = [b] 
     self.c = [c] 

    def extend(self, b, c): 
     self.b.append(b) 
     self.c.append(c) 

    def __str__(self): 
     return "({a}, {b}, {c})".format(**self.__dict__) 

    def __repr__(self): 
     return "<{}({})>".format(type(self).__name__, self) 


sources = [ 
    (2, 'B0', 'C0'), 
    (3, 'B1', 'C1'), 
    (5, 'B2', 'C2'), 
    (2, 'B3', 'C3'), 
    (4, 'B4', 'C4'), 
    (4, 'B5', 'C5'), 
    (2, 'B6', 'C6'), 
    (3, 'B7', 'C7'), 
    (5, 'B8', 'C8'), 
    (2, 'B9', 'C9'), 
    (4, 'B10', 'C10'), 
    (2, 'B11', 'C11'), 
    (2, 'B12', 'C12'), 
    (4, 'B13', 'C13'), 
    (2, 'B14', 'C14'), 
    (4, 'B15', 'C15'), 
    (4, 'B16', 'C16'), 
    (3, 'B17', 'C17'), 
    (4, 'B18', 'C18'), 
    (1, 'B19', 'C19'), 
    (3, 'B20', 'C20'), 
    (4, 'B21', 'C21'), 
    (5, 'B22', 'C22'), 
    (1, 'B23', 'C23'), 
    (3, 'B24', 'C24'), 
    (4, 'B25', 'C25'), 
    (3, 'B26', 'C26'), 
    (2, 'B27', 'C27'), 
    (4, 'B28', 'C28'), 
    (5, 'B29', 'C29') 
    ] 

for data in sources: 
    MyObj.insert(*data) 

print MyObj.list_instances() 
print MyObj.get_instances(5) 
+0

Thx!私は別にそれをしましたが、dictキーとしてタプルを使用することは素晴らしい思い出でした! – Eulenfuchswiesel

関連する問題