在python中二进制常量的前缀_在Python中对字符串前缀执行二进制搜索

通过使用使用选择的自定义比较器的实例,可以使用自定义比较来欺骗bisect:

>>> class PrefixCompares(object):

... def __init__(self, value):

... self.value = value

... def __lt__(self, other):

... return self.value < other[0:len(self.value)]

...

>>> import bisect

>>> names = ['adam', 'bob', 'bob', 'bob', 'bobby', 'bobert', 'chris']

>>> names.sort()

>>> key = PrefixCompares('bob')

>>> leftIndex = bisect.bisect_left(names, key)

>>> rightIndex = bisect.bisect_right(names, key)

>>> print(names[leftIndex:rightIndex])

['adam', 'bob', 'bob', 'bob', 'bobby', 'bobert']

>>>

DOH.正确的平分工作,但左边显然没有. “adam”没有以“bob”为前缀!要修复它,你也必须调整顺序.

>>> class HasPrefix(object):

... def __init__(self, value):

... self.value = value

... def __lt__(self, other):

... return self.value[0:len(other.value)] < other.value

...

>>> class Prefix(object):

... def __init__(self, value):

... self.value = value

... def __lt__(self, other):

... return self.value < other.value[0:len(self.value)]

...

>>> class AdaptPrefix(object):

... def __init__(self, seq):

... self.seq = seq

... def __getitem__(self, key):

... return HasPrefix(self.seq[key])

... def __len__(self):

... return len(self.seq)

...

>>> import bisect

>>> names = ['adam', 'bob', 'bob', 'bob', 'bobby', 'bobert', 'chris']

>>> names.sort()

>>> needle = Prefix('bob')

>>> haystack = AdaptPrefix(names)

>>> leftIndex = bisect.bisect_left(haystack, needle)

>>> rightIndex = bisect.bisect_right(haystack, needle)

>>> print(names[leftIndex:rightIndex])

['bob', 'bob', 'bob', 'bobby', 'bobert']

>>>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值