2011-09-29 141 views
0

我有兩個列表。 List1包含對象,每個對象都有node1屬性。 List2包含節點列表,它們是存儲在list1中的對象的屬性。獲取列表元素的屬性

我想創建單獨的列表,其中包含其節點存在於list2中的對象的列表。我想創建這個列表而不使用for循環,因爲我的對象列表很大,所以如果我使用for循環代碼需要很長時間才能運行。

我如何在python中實現這一點?

回答

0

在我看來還有比用for循環沒有其他辦法:

final_list = [] 
for obj in list1: 
    if obj.node1 in list2: 
     final_list.append(obj) 

編輯: 對於註釋,使用set是查找元素(感謝eumiro)速度快:

set2 = set(list2) 
... 
    if obj.node1 in set2: 

另外,你可以把代碼寫在一行(感謝rocksportrocker):

final_list = [obj for obj in list1 if obj not in set2] 
+0

你可以通過在循環前創建一個'set2 = set(list2)'來加速這個條件並檢查'set2中的obj.node1'。 – eumiro

+0

@eumiro這是如果你要使用'list'的方式;它將O(m * n)轉換爲O(m + n)平均值,這是您可以做的最好的選擇。 – agf

+0

把這個寫成列表理解[obj對於list1中的obj,如果obj不在列表2中]代碼較少,但我認爲它不會更快 – rocksportrocker

2

聽起來像是時候重新設計你的程序了。將列表2替換爲defaultdict(None)將列表1中的對象映射到其節點屬性。將其稱爲node,以便您可以使用node[x]獲得對象x的節點。您可以在O(m)時間獲得node.values()的所有節點(無序)列表,其中m是具有關聯節點的對象的數量。

(可替代地,存儲在對象node屬性與None指示沒有節點,並得到與[x.node for x in list1 if x.node is not None]節點;這需要O(Ñ)的時間,但可能比for循環更快。)