我有两个清单。 List1包含对象,每个对象都有node1属性。 List2包含节点列表,这些节点是存储在list1中的对象的属性。
我想创建单独的列表,其中包含其节点存在于list2中的对象列表。我想在不使用for循环的情况下创建这个列表,因为我的对象列表很大,所以如果我使用for循环,代码需要很长时间才能运行。
如何在python中实现这一目标?
答案 0 :(得分:2)
听起来是时候重新设计你的程序了。将列表1中的对象映射到节点属性,将列表2替换为defaultdict(None)
。将其称为node
,以便您可以使用x
获取对象node[x]
的节点。您可以在O( m )时间内获取node.values()
的所有节点(无序)列表,其中 m 是具有关联节点的对象数。
(或者,在node
对象中存储None
属性,表示没有节点,并获取[x.node for x in list1 if x.node is not None]
的节点;这需要O( n )时间但可能比for
循环更快。)
答案 1 :(得分: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]