簡體   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