Python 在dict()上使用'bisect_left()`引发'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

这是我的密码。我正在尝试从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+=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描述的错误,