基于属性

时间:2016-05-18 07:37:11

标签: python iteration list-comprehension itertools

我有一个对象列表,我从中筛选出在单个属性中具有特定值的对象:

import itertools 
iterator = itertools.ifilter(lambda record: record.outcome==1, list) 

迭代器现在拥有outcome = 1

的所有对象

但是,它们现在在另一个属性order=X

的值上有所不同

我想将迭代器分为两部分:一部分用于那些order = 1

的对象

和另一个order > 1

的人

是否有另一种方法,而不是循环遍历所有元素并将它们添加到两个列表/列表理解中的一个?

说我有一个l列表obj1,obj2,obj3作为内容obj1.order=1obj2.order=2obj3.order=3我想要a # containing obj1  和b # containing obj2 & obj3

最好,我想有两个其他的迭代器,这样我就可以处理部分列表,无论我想做什么!

我在考虑itertools.groupby,但由于我的变量order=X有许多可能的值,它会给我两个以上的子迭代器!

1 个答案:

答案 0 :(得分:0)

使用teeifilter。您并不一定需要tee,但如果原始迭代器很昂贵,它可能会提高效率。

import itertools 
iter_outcome = itertools.ifilter(lambda record: record.outcome==1, list)
a, b = itertools.tee(iter_outcome, 2)
iter_order_1 = itertools.ifilter(lambda record: record.order == 1, a)
iter_greater_1 = itertools.ifilter(lambda record: record.order > 1, b)