我有兩個列表。 List1包含對象,每個對象都有node1屬性。 List2包含節點列表,它們是存儲在list1中的對象的屬性。獲取列表元素的屬性
我想創建單獨的列表,其中包含其節點存在於list2中的對象的列表。我想創建這個列表而不使用for循環,因爲我的對象列表很大,所以如果我使用for循環代碼需要很長時間才能運行。
我如何在python中實現這一點?
我有兩個列表。 List1包含對象,每個對象都有node1屬性。 List2包含節點列表,它們是存儲在list1中的對象的屬性。獲取列表元素的屬性
我想創建單獨的列表,其中包含其節點存在於list2中的對象的列表。我想創建這個列表而不使用for循環,因爲我的對象列表很大,所以如果我使用for循環代碼需要很長時間才能運行。
我如何在python中實現這一點?
在我看來還有比用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]
聽起來像是時候重新設計你的程序了。將列表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
循環更快。)
你可以通過在循環前創建一個'set2 = set(list2)'來加速這個條件並檢查'set2中的obj.node1'。 – eumiro
@eumiro這是如果你要使用'list'的方式;它將O(m * n)轉換爲O(m + n)平均值,這是您可以做的最好的選擇。 – agf
把這個寫成列表理解[obj對於list1中的obj,如果obj不在列表2中]代碼較少,但我認爲它不會更快 – rocksportrocker