获取列表元素的属性
问题描述:
我有两个列表。 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