我有一个Python列表,里面填充了我定义的类的实例。
我想创建一个新列表,其中包含原始列表中符合其中一个属性的特定条件的所有实例。
也就是说,对于list1
中填充了某些class obj
实例的所有元素,我想要obj.attrib == someValue
的所有元素。
我使用普通for循环完成此操作,循环并检查每个对象,但我的列表非常长,我想知道是否有更快/更简洁的方式。
谢谢!
答案 0 :(得分:2)
有一个更简洁的方法,列表理解:
filtered_list = [obj for obj in list1 if obj.attrib==someValue]
我不知道你是否可以更快地走,因为在你描述的问题中,你总是要以某种方式检查列表中的每个对象。
答案 1 :(得分:1)
你也许可以使用熊猫系列。将您的列表读入熊猫系列your_list
。
然后,您可以使用[]
语法和.apply
方法进行过滤:
def check_attrib(obj, value):
return obj.attrib==value
new_list = your_list[your_list.apply(check_attrib)]
请记住[]
语法通过括号内系列的布尔值过滤系列。例如:
spam = [1, 5, 3, 7]
eggs = [True, True, False, False]
比spam[eggs]
返回:
[1, 5]
这是一个向量运算,通常应该比循环更有效。
答案 2 :(得分:1)
为了完整起见,您还可以使用filter和lambda expression:
filtered_lst1 = filter(lambda obj: obj.attrib==someValue, lst1)