获取列表元素的属性

问题描述:

我有两个列表。 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] 
+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替换为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循环更快。)