根据属性从另一个Python列表中提取对象列表

时间:2016-05-25 16:59:41

标签: python

我有一个Python列表,里面填充了我定义的类的实例。

我想创建一个新列表,其中包含原始列表中符合其中一个属性的特定条件的所有实例。

也就是说,对于list1中填充了某些class obj实例的所有元素,我想要obj.attrib == someValue的所有元素。

我使用普通for循环完成此操作,循环并检查每个对象,但我的列表非常长,我想知道是否有更快/更简洁的方式。

谢谢!

3 个答案:

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

为了完整起见,您还可以使用filterlambda expression

filtered_lst1 = filter(lambda obj: obj.attrib==someValue, lst1)