[英]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.