2016-08-19 3 views
0

У меня есть куча взаимозависимых переменных, которые я хочу сохранить в списке элементов класса. Теперь я хочу, чтобы он сортировался по одной из функций класса. На данный момент, что я делаю это:Создайте класс 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) 'в' read_in_data'. Вы хотите * group * (а не * sort *) значение 'b' и' c' каждого 'a' (с дубликатами). Неясно, действительно ли факт, даже после запуска вашего кода на каком-то примере. Вы можете объяснить? –

+0

Sry за то, что он недостаточно ясен. Ваше понимание в основном правильное, но вход не обязательно является кортежем, в моем случае это список списков. Для моих данных они были бы, например, 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

Первый пункт, вы хотите использовать dict (или OrderedDict, если вопрос о заказе), а не list - это делает более читаемым и намного более быстрый код.

Во-вторых, вы хотите инкапсулировать всю обработку этой коллекции (особенно часть «создать или продлить»), чтобы клиентский код не заботился об этом. classmethod s (методы, которые принимают класс, а не экземпляр - как первый аргумент) являются вашим другом здесь.

Вот простой пример, который поможет вам начать:

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! Я сделал это по-другому, но использование кортежей в качестве ключей ключей было большим напоминанием! – Eulenfuchswiesel