[英]Using `bisect_left()` on dict() raising `dict is not a sequence` error. How to traverse a dict() to improve search process time
这是我的代码。 我正在尝试从 word 文件创建一个 dict 并将其用于搜索过程。 我在lists
上使用bisect_left()
在dict()
) 上使用相同会引发序列错误
import bisect
fln = open("CROSSWD.TXT")
def create_dict(x):
new_dict=dict()
i=0
for line in x:
word=line.strip()
new_dict[word]= i
i+=1
return new_dict #create a new_dict
如何在字典上使用 bisect_left?
def search_dict(new_dict,s):
i= bisect_left(new_dict,s) #raises a sequence error. what other method can I use?
if s in new_dict[i]:
return True
else:
return False
s='zebra'
new_dict=create_dict(fln)
if search_dict(new_dict,s):
print(s," in dict")
else:
print(s," not in dict")
bisect_left
需要一个支持 integer 索引的 object,因为二等分算法需要知道什么是“中间”元素才能平分序列。 bisect_left 的bisect_left
实现令人困惑地引发了一个TypeError
,声称dict
类型的 object 没有长度。 虽然这种说法是错误的,但最好比纯 Python 版本(见下文)更早地检测和拒绝dict
参数。
也就是说,没有必要在dict
上使用bisect
: dict
的目的是允许 O(1) 通过散列访问 object,而不必通过二进制搜索来搜索 O(log n) 时间。
bisect_left 的纯bisect_left
版本,减去一些注释:
def bisect_left(a, x, lo=0, hi=None):
if lo < 0:
raise ValueError('lo must be non-negative')
if hi is None:
hi = len(a)
while lo < hi:
mid = (lo+hi)//2
if a[mid] < x: lo = mid+1
else: hi = mid
return lo
请注意, len(a)
是在假设您稍后可以使用从长度派生的 integer 索引a
的情况下计算的。 dict
并非如此(或者如果您没有得到KeyError
,它肯定不会帮助您定位目标)。 此外,一旦bisect
模块定义了纯 Python 函数,它就会尝试用从_bisect
导入的纯 C 函数替换它们。 这些功能显然会提前检查以确保a
不是dict
。 引发的错误消息有点误导。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.