0
    def unique(ip):
         file = open("/home/USER/Desktop/ipAddreses.txt",'r')
         list = file.readlines()
         list.sort()
         low = 1
         hi = len(list)
         target = convertToStr(ip)
         if hi > 1:
                 while low <= hi:
                 mid = low + (hi-low)/2
                 if list[mid] == target:
                     file.close()
                     return False            
                 elif list[mid] < target: 
                     low = mid+1
                 else:
                     hi = mid-1
         else:
                 if target == list[0]:
                     return False

file.close()
return True

このエラーを取得します。

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

目的は、生成された IP アドレスを検索して、ランダムに作成されたすべての IP アドレスが一意であることを確認することです。前に働いていた...家に帰って、今このエラーが発生する

4

2 に答える 2

0

コードの問題をすぐに修正する方法はわかりませんが、目前の問題を解決したいだけの場合は、これが最善の方法ではない可能性があります。

  • 一般に、並べ替えてからバイナリ検索を実行することは、配列に対して単純な線形検索を実行することよりも、ほとんどの場合、より悪い結果になります。並べ替えはO(n log n)であり、実際には、配列の各要素を少なくとも1回「調べる」必要があり、ファイル全体の少なくとも1つのコピーをメモリに格納する必要があります。ファイルを反復処理するだけの場合は、各要素を最大で1回確認し、一定量のメモリのみを使用します。

  • とにかく二分探索を自分で実装するべきではありません(練習のために実装している場合を除く)。なぜなら、発見したように、厄介な部分を間違えるのは簡単だからです。代わりbisectモジュールを使用してください。

  • 明示的に閉じていないコードからの出口パスがあるようですfiletarget == list[0]部分)。これがステートメントが優れている理由withです。彼らはあなたのためにそれを処理します。

代わりに、次のようにすることができます。

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)

多数のIPアドレスを呼び出す場合はunique、毎回ファイル全体を読み取ることを避け、set:を使用してはるかに高速なルックアップを取得できます。

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

とは言うものの、モジュールのソースとbisect比較すると、違いは使用しているように見えますwhile low <= hiが、使用しているwhile lo < hiのと、使用しているhi = mid - 1場所で使用しているのhi = midです。(確認のために実行していませんが)検索している文字列がリスト内で最大の文字列である場合は、で終わると思います。low == hi == len(list)そのため、を設定します。mid = len(list)これを実行すると壊れますlist[mid]

于 2013-02-17T06:18:38.850 に答える
-1

リストに存在するかどうかを確認します。

if mid in list:
    if list[mid] == target:
        # ...
于 2013-02-17T06:12:59.100 に答える