nikosL
nikosL

Reputation: 11

binary search for list in python

My code for binary search function in a list returns true for a value in the list, but returns None (instead of false) for values not in the list.

Can someone please explain me what I'm doing wrong?

The program is:

def searchlist(x,alist):
        end=int(len(alist)-1)
        mid=int(len(alist)/2)

        while len(alist)>2:
                if  x==alist[mid] or x==alist[0] or x==alist[end] :
                        return("true")
                        break
                elif x>alist[mid]:
                        alist=alist[mid:]
                        mid=int(len(alist)/2)
                        end=int(len(alist)-1)


                elif x<alist[mid]:
                        alist=alist[:mid]
                        mid=int(len(alist)/2)
                        end=int(len(alist)-1)

                else:
                        return("false")

aList=[2,3,5,7,9,12,14,23,34,45,67,89,101]

xnum=int(input("enter a number:"))
searchlist(xnum,aList)
print(searchlist(xnum,aList))

Upvotes: 0

Views: 614

Answers (2)

Ali Kargar
Ali Kargar

Reputation: 189

Your while loop cannot catch the else statement. you don't need that else. try this :

def searchlist(x,alist):
    end=int(len(alist)-1)
    mid=int(len(alist)/2)
    result = False
    while len(alist)>2:
            if  x==alist[mid] or x==alist[0] or x==alist[end] :
                    result = True
            elif x>alist[mid]:
                    alist=alist[mid:]
                    mid=int(len(alist)/2)
                    end=int(len(alist)-1)

            elif x<alist[mid]:
                    alist=alist[:mid]
                    mid=int(len(alist)/2)
                    end=int(len(alist)-1)

    return result

aList=[2,3,5,7,5,67,89,101]

xnum=int(input("enter a number:"))
print(searchlist(xnum,aList))

Upvotes: 0

Yakov Dan
Yakov Dan

Reputation: 3347

You get None when your function does not return a value. This happens because the while loop terminates without going into the "else" branch. A better practice would be to return True (not the string, but the Boolean value) when you find the value in the list, and return False after the loop.

Upvotes: 1

Related Questions