使用相同的列表属性对对象分组

2024-04-18 13:31:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两门课:

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对象的列表,那么如何将具有相同的b_listclass A对象组合在一起?在

例如:

^{pr2}$

在处理之后,应该给我们两个列表,一个列表包含第一个和第三个A,另一个列表只有第二个A。或者简单地说:

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

Tags: 对象nameself类型列表initdefli
2条回答

您可以使用属性b\u list作为键对a_list进行排序。在

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

或者:

^{pr2}$

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

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

现在,既然你的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()

结果:

^{pr2}$

相关问题 更多 >