将具有相同列表属性的对象分组

时间:2016-03-07 02:56:54

标签: python class attributes grouping

我有两个班级:

class A:
   def __init__(self, name, li):
      self.b_list = li

class B:
   def __init__(self, i):
      self.i = i

class A包含class B类型的对象列表。

假设我有class A个对象的列表,如何将class A个具有相同b_list的对象组合在一起?

例如:

a_list = []

li = [B(1), B(2), B(3)]
a_list.append(A(li))

li = [B(2), B(3)]
a_list.append(A(li))

li = [B(1), B(2), B(3)]
a_list.append(A(li))

处理完毕后,我们应该为我们提供两个列表,一个列表包含第一个和第三个A,另一个列表只包含第二个A。或者简而言之:

result = [
   [ A([B(1),B(2),B(3)]), A([B(1),B(2),B(3)]) ],
   [ A([B(2),B(3)] ]
]

2 个答案:

答案 0 :(得分:1)

对于初学者,我已从A类中删除了name参数,因为其余的细节都省略了它。

要将A类对象组合在一起,您需要准确定义两个A对象相等时的含义。我创建了一个__cmp__方法,让我们通过比较它们来对A对象进行排序。

现在,由于您的A对象由B对象组成,因此您需要一些东西来定义两个B对象相等的含义。我在B类中创建了一个__eq__方法。

接下来,我对A个实例进行了排序,以便对它们进行分组,并为A类添加了__str__方法,为B类添加了__repr__方法,以便您可以验证它们是否正在正确组合在一起。

我没有在任何地方添加任何错误检查,所以这段代码有点脆弱。

class A:
    def __init__(self, li):
        self.b_list = li

    def __cmp__(self, other):
        return cmp([elem.i for elem in self.b_list], 
                   [elem.i for elem in other.b_list])

    def __str__(self):
        return "A({})".format(self.b_list)

class B:
    def __init__(self, i):
       self.i = i

    def __eq__(self, other):
       return self.i == other.i

    def __repr__(self):
        return "B({})".format(self.i)

def main():

    a_list = []

    li = [B(1), B(2), B(3)]
    a_list.append(A(li))

    li = [B(2), B(3)]
    a_list.append(A(li))

    li = [B(1), B(2), B(3)]
    a_list.append(A(li))

    result = []
    last_item = None
    for item in sorted(a_list):
        if last_item and item == last_item:
            result[-1] = result[-1] + [item]
        else:
            result.append([item])
        last_item = item

    for row in result:
        print [str(elem) for elem in row]

if __name__ == '__main__':
    main()

结果:

['A([B(1), B(2), B(3)])', 'A([B(1), B(2), B(3)])']
['A([B(2), B(3)])']

答案 1 :(得分:0)

您可以使用属性b_list作为键对a_list进行排序。

a_list.sort(key=lambda a:a.b_list)

或:

from operator import itemgetter

a_list.sort(key=itemgetter("b_list"))