2016-04-17 18 views
-3

我有兩個對象,我想以這樣一種方式合併,即對兩個合併對象的所有引用現在指向一個合併對象。高效地合併python中的兩個對象

#What I want 
listOfObjects=[obj1, obj1, obj2, obj2, obj3] 
mergeObjects(obj1, obj2) 
#now 
listofObjects==[merged, merged, merged, merged, obj3] 

之一來完成它的方法是這樣的:

def mergeObjects(obj1, obj2): 
    obj1.property1+=obj2.property1 
    obj1.property2+=obj2.property2 
    obj2=obj1 

然而,這具有而非具有一個被拼接對象,我有一個拼接對象和它的相同副本下行。我的程序會將幾十個對象合併到一起,所以這會消耗太多的內存。

另一種方法是:

listOfObjects=[obj1, obj1, obj2, obj2, obj3] 
mergeObjects(obj1, obj2) 
for i in range(len(listOfObjects)): 
    if (listOfObjects[i]==obj2): 
     listOfObjects[i]==obj1 
#now 
listofObjects==[merged, merged, merged, merged, obj3] 
#and obj2 is now free to be garbage collected 

不過,也有對這些對象的多重引用和迭代,每次我合併的對象也不是最佳的他們中的每一個。

我想到的一件事是如果我可以使用指針。我可以指針的列表,而不是存儲對象,然後寫:

def mergeObjects(obj1_pointer, obj2_pointer): 
    obj1=&obj1_pointer 
    obj2=&obj2_pointer 
    obj1.property1+=obj2.property1 
    obj1.property2+=obj2.property2 
    obj2_pointer=obj1_pointer 
    #let's say the pointers are themselves objects so now we have: 

    listOfPointers==[obj1_pointer, obj1_pointer, obj1_pointer, obj1_pointer, obj3_pointer] 
    #obj1_pointer is now pointing to the merged object 
    #obj2 now has no references so is free to be deleted 

當我使用&作爲引用操作。

那麼編寫我自己的pseudopointer對象與返回對象的解引用方法是一個有效的解決方案?

如果不是有更乾淨的方式來做到這一點(將對象1改爲合併的對象,然後將對象2的所有引用改爲對對象1的引用)?

+0

我不明白你想完成什麼......而且我也不確定你要做什麼。 –

+2

「我有兩個對象需要合併,這樣所有對兩個合併對象的引用現在都指向一個合併對象。」 - 不可能。你爲什麼想這樣做?有可能有更好的方法來設計你的程序。例如,您可能想要使用[union-find數據結構](https://en.wikipedia.org/wiki/Disjoint-set_data_structure)。 – user2357112

+0

如果你有一個'[x,y,z]'的列表,並且你想合併x和y,沒有辦法將所有指向y的指針改變爲合併對象而不直接改變列表中的指針(所以mylist [i] =合併) –

回答

0

A union-find data structure是做這種事情的好方法。它將對象分組爲一組並挑選每組中的一個元素作爲代表。它支持兩種操作:

  • 找到,這需要一個對象,並返回一個對象的集合的代表,
  • 工會,這需要兩個對象,並加入他們的集合爲一組。其中一組代表成爲合併組的代表。

您可以使用代表來跟蹤合併的屬性。通過按照等級和路徑壓縮的聯合來實施通常的方式,作爲disjoint-set forest,這些操作有效地分攤爲恆定時間,並且合併集合沒有出現問題。 (如果你試圖用內置setset.union,你會得到合併,套拆散和很慢的操作做到這一點。)


至於實際合併所有兩個對象引用指向一個對象,沒有辦法做到這一點。你的指針想法有它自己的問題;即使Python支持指針,當您嘗試將一個指針合併到第三個指針時,您最終也會得到先前合併的指針。