获取列表元素的属性

时间:2011-09-29 10:41:19

标签: python

我有两个清单。 List1包含对象,每个对象都有node1属性。 List2包含节点列表,这些节点是存储在list1中的对象的属性。

我想创建单独的列表,其中包含其节点存在于list2中的对象列表。我想在不使用for循环的情况下创建这个列表,因为我的对象列表很大,所以如果我使用for循环,代码需要很长时间才能运行。

如何在python中实现这一目标?

2 个答案:

答案 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]