我有两个班级:
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)] ]
]
答案 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"))