b.__gt__(a)
が実装されていないときに Python が試行することを考えるとa.__lt__(b)
、ログ エントリのクラスを変更する必要はありません。十分にスマートなキーを提供するだけで十分です。
import bisect
from functools import total_ordering
from operator import itemgetter
log = [
{'time': 199920331000, 'message': 'message1'},
{'time': 199920331001, 'message': 'message2'},
# ...
]
@total_ordering
class Key(object):
def __init__(self, keyfunc, keyval):
self.keyfunc = keyfunc
self.keyval = keyval
def __eq__(self, other):
return self.keyval == self.keyfunc(other)
def __lt__(self, other):
return self.keyval < self.keyfunc(other)
start = bisect.bisect(log, Key(itemgetter("time"), 199920331000))
print log[start:]
別の方法として、dict のリストをビューでラップすることもできます。
def keyed(items, key):
class View(object):
def __getitem__(self, index):
return key(items[index])
def __len__(self):
return len(items)
return View()
start = bisect.bisect(keyed(log, itemgetter("time")), 199920331000)
print log[start:]
(これはSmart way to delete tuplesから取り除かれています)