我有一个对象列表,并希望根据某些条件对其进行过滤。我可以用列表理解来做到这一点:
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整除?
答案 0 :(得分:4)
一种方法是使用自定义lambda
功能。为清楚起见,这个很冗长。
filter(lambda dt: hasattr(dt, 'hour') and dt.hour % 6, dates)
只有在期望hasattr
序列中的非日期对象时,才需要dates
检查。
我想添加一个注释,列表推导优先于map
和filter
。您可以将上述内容重写为:
[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)