Цепные операторные функции в фильтре Python - PullRequest
2 голосов
/ 05 октября 2010

У меня есть список объектов и я хочу отфильтровать их по некоторым критериям. Я могу сделать это с пониманием списка:

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 (не 0):

import operator

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

но как я могу добавить к ней также часть (6).__rmod__, которая скажет мне, делится ли атрибут hour на 6?

Ответы [ 2 ]

4 голосов
/ 05 октября 2010

Одним из способов является использование пользовательской функции 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 голос
/ 05 октября 2010

К сожалению, нет готового метода для выполнения rmod, поэтому лучше всего использовать лямбду (или LC).

filter(lambda x: not x.hour % 6, dates)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...