Python 在dict()上使用'bisect_left()`引发'dict'不是序列'错误。如何遍历dict()以缩短搜索过程时间
这是我的密码。我正在尝试从word文件创建一个dict,并将其用于搜索过程。我在列表中使用对分_,在dict中使用相同的对分_会引发序列错误Python 在dict()上使用'bisect_left()`引发'dict'不是序列'错误。如何遍历dict()以缩短搜索过程时间,python,python-3.x,Python,Python 3.x,这是我的密码。我正在尝试从word文件创建一个dict,并将其用于搜索过程。我在列表中使用对分_,在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
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
如何使用dict上的左二等分
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")
对分_left需要一个支持整数索引的对象,因为对分算法需要知道中间元素是什么才能对分序列。bisect_left的C实现令人困惑地引发了一个TypeError,声称dict类型的对象没有长度。虽然这种说法是错误的,但最好比下面的纯Python版本更早地检测并拒绝dict参数
这就是说,没有必要在dict上使用对分:dict的目的是允许O1通过哈希访问对象,而不是必须通过二进制搜索一次又一次地搜索它
左为bisect_的纯Python版本,减去一些注释:
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
请注意,lena的计算假设是后者可以使用从长度派生的整数索引a。这对于dict来说是不正确的,或者如果你没有得到一个键错误,它肯定不会帮助你定位你的目标。此外,一旦对分模块定义了纯Python函数,它就会尝试用从_bisect导入的纯C函数替换它们。这些函数显然很早就进行了检查,以确保a不是dict。引发的错误消息有点误导。对分\u left需要一个支持整数索引的对象,因为对分算法需要知道中间元素是什么才能对分序列。bisect_left的C实现令人困惑地引发了一个TypeError,声称dict类型的对象没有长度。虽然这种说法是错误的,但最好比下面的纯Python版本更早地检测并拒绝dict参数
这就是说,没有必要在dict上使用对分:dict的目的是允许O1通过哈希访问对象,而不是必须通过二进制搜索一次又一次地搜索它
左为bisect_的纯Python版本,减去一些注释:
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
请注意,lena的计算假设是后者可以使用从长度派生的整数索引a。这对于dict来说是不正确的,或者如果你没有得到一个键错误,它肯定不会帮助你定位你的目标。此外,一旦对分模块定义了纯Python函数,它就会尝试用从_bisect导入的纯C函数替换它们。这些函数显然会提前进行检查,以确保a不是dict。引发的错误消息有点误导。因此,搜索时间是一个常数,与数据集的大小无关?是,哈希表就是这样工作的:它本质上只是一个数组和一个函数,它将一个值映射到一个用于索引数组的整数。dict不支持len,如果不是完全错误的话,那就是混淆。也许最好说dict不支持位置索引或类似的功能。我不确定你所说的各种迭代器的作用是什么,各种dict迭代器既不支持len也不支持位置索引。我同意,但我这样说是因为这是bisect_left本身引发的错误消息的要点:bisect_left{},foo产生TypeError:dict类型的对象没有len,这导致了巨大的附录。我将改写第一段,这个奇怪的错误消息只出现在较旧的Python版本上。现在应该是TypeError:dict不是一个序列,听起来更像OP描述的错误,因此,搜索时间是一个常数,与数据集的大小无关?是的,哈希表就是这样工作的:它本质上只是一个数组和一个函数,它将一个值映射到一个用于索引数组的整数。dict不支持len,如果不是完全错误的话,那就是混淆。也许最好说dict不支持位置索引或类似的功能。我不确定你所说的各种迭代器的作用是什么,各种dict迭代器既不支持len也不支持位置索引。我同意,但我这样说是因为这是bisect_left本身引发的错误消息的要点:bisect_left{},foo产生TypeError:dict类型的对象没有len,这导致了巨大的附录。我将改写第一段,这个奇怪的错误消息只出现在较旧的Python版本上。现在应该是TypeError:dict不是序列,听起来更像OP描述的错误,