Python 2.7 在python中运行此二进制搜索方法时出现索引错误

Python 2.7 在python中运行此二进制搜索方法时出现索引错误,python-2.7,Python 2.7,目的是搜索生成的ip地址,以确保所有随机创建的ip地址都是唯一的。我以前工作过。。。回到家后,我发现了这个错误,请检查mid是否存在于列表中 if list[mid] == target: IndexError: list index out of range 我不知道如何用代码解决问题,但是如果你只是想解决手头的问题,这可能不是最好的方法 通常,排序然后进行二进制搜索几乎总是比在数组上进行简单的线性搜索更糟糕。排序是O(n logn),实际上需要至少“查看”数组的每个元素一

目的是搜索生成的ip地址,以确保所有随机创建的ip地址都是唯一的。我以前工作过。。。回到家后,我发现了这个错误,请检查mid是否存在于列表中

    if list[mid] == target:
    IndexError: list index out of range

我不知道如何用代码解决问题,但是如果你只是想解决手头的问题,这可能不是最好的方法

  • 通常,排序然后进行二进制搜索几乎总是比在数组上进行简单的线性搜索更糟糕。排序是O(n logn),实际上需要至少“查看”数组的每个元素一次,并且需要在内存中存储整个文件的至少一个副本。如果您只是在文件上迭代,那么最多只能查看一次每个元素,并且只使用恒定的内存量

  • 无论如何,您可能不应该自己实现二进制搜索(除非您是为了练习而这样做的),因为您已经发现很容易出错;改用

  • 看起来代码中有一个退出路径,您没有显式关闭
    文件
    target==list[0]
    部分)。这就是为什么
    with
    语句很好;他们会帮你处理的

您可以这样做:

if mid in list:
    if list[mid] == target:
        # ...
如果要在一组ip地址上调用
unique
,可以避免每次读取整个文件,并使用
集合
,获得更快的查找速度:

def unique(ip):
    ip_str = convertToStr(ip)
    with open("/home/USER/Desktop/ipAddreses.txt", 'r') as f:
         return all(line.rstrip() != ip_str for line in f)


也就是说,与之相比,区别在于您使用的是
,而low
mid
是一个整数。它不会出现在字符串列表中。我已经尝试过对代码进行编辑,但现在我在elif语句中收到了错误。我完全糊涂了。我理解二进制搜索的逻辑,但我不知道为什么mid会超出索引。当我切换到二进制搜索而不是强制搜索时,我有一个非常大的txt文件。我想知道它是否需要大量的数据才能工作。谢谢!!!!!!!!最终目的是在完成课堂作业的同时提高我的理解力。。。。但是我可以问一下为什么我不应该自己实现二进制搜索吗?更好的是,应该在哪里实现二进制搜索?当然,为了确保您理解算法,您自己实现二进制搜索是值得的。但是一旦你做到了,如果你只是尝试使用二进制搜索,就不值得重写代码了,因为它需要相当多的空间和精力,而且要做对有些烦人。调用标准库的实现使其更容易阅读、更容易编写、更容易正确(出错的地方更少),并且运行更快(因为它是用C实现的)。如果您不介意的话,还有一个问题,我也在为同一个文件创建随机地址,将使用:with open(…)新创建的ip地址的自动更新如果您谈论的是创建
集的方法
-不,不会,但您可以直接将它们添加到具有
ip\u地址的集。添加(new\u ip\u str)
,并将它们添加到文件中。再次感谢!你帮了大忙!
def unique(ip):
    ip_str = convertToStr(ip)
    with open("/home/USER/Desktop/ipAddreses.txt", 'r') as f:
         return all(line.rstrip() != ip_str for line in f)
with open("/home/USER/Desktop/ipAddreses.txt", 'r') as f:
    ip_addresses = set(line.rstrip() for line in f)

def unique(ip):
    return convertToStr(ip) not in ip_addresses