繁体   English   中英

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

[英]Group objects with an identical list attribute

我有两个班级:

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_list 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)] ]
]

首先,我已经从 A 类中删除了name参数,因为您的其余详细信息都省略了它。

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

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

接下来,我已经整理了一个实例,以使它们组合更容易,并且加入了__str__方法A类和__repr__方法,B类,以便您可以验证它们被组合在一起正确。

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

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)])']

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

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

或者:

from operator import itemgetter

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM