繁体   English   中英

在 dict() 上使用 `bisect_left()` 会引发 `dict is not a sequence` 错误。 如何遍历 dict() 以改进搜索过程时间

[英]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上使用bisectdict的目的是允许 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM