在Python的过滤器中链接运算符函数

时间:2010-10-05 06:22:12

标签: python operators filter

我有一个对象列表,并希望根据某些条件对其进行过滤。我可以用列表理解来做到这一点:

import datetime, pytz
# let's have a range of 100 hourly datetimes (just an example!):
dates = [ datetime.datetime(2010, 10, 1, 0, 0, 0, 0, pytz.utc) + datetime.timedelta(hours=i) for i in xrange(100) ]

# now I want a list of all dates, where hour in (0, 6, 12, 18)...
[ dt for dt in dates if dt.hour % 6 == 0 ]

哪种方法正常。

如何使用filter函数(对于更大的数据集,因此速度很重要)?我可以检查dt.hour是否为True(不是0):

import operator

filter(operator.attrrgetter('hour'), dates)

但是如何将(6).__rmod__部分也添加到其中,这将告诉我hour属性是否可以被6整除?

2 个答案:

答案 0 :(得分:4)

一种方法是使用自定义lambda功能。为清楚起见,这个很冗长。

filter(lambda dt: hasattr(dt, 'hour') and dt.hour % 6, dates)

只有在期望hasattr序列中的非日期对象时,才需要dates检查。

我想添加一个注释,列表推导优先于mapfilter。您可以将上述内容重写为:

[dt for dt in dates if hasattr(dt, 'hour') and dt.hour % 6]

答案 1 :(得分:1)

不幸的是,没有预制方法来做rmod,所以最好是使用lambda(或LC)。

filter(lambda x: not x.hour % 6, dates)