Check if Isogram Using Python


The challenge

An isogram is a word that has no repeating letters, consecutive or non-consecutive. Implement a function that determines whether a string that contains only letters is an isogram. Assume the empty string is an isogram. Ignore letter case.

is_isogram("Dermatoglyphics" ) == true
is_isogram("aba" ) == false
is_isogram("moOse" ) == false # -- ignore letter case

Test cases

Test.assert_equals(is_isogram("Dermatoglyphics"), True )
Test.assert_equals(is_isogram("isogram"), True )
Test.assert_equals(is_isogram("aba"), False, "same chars may not be adjacent" )
Test.assert_equals(is_isogram("moOse"), False, "same chars may not be same case" )
Test.assert_equals(is_isogram("isIsogram"), False )
Test.assert_equals(is_isogram(""), True, "an empty string is a valid isogram" )

The solution in Python

First pass, using a dictionary (dict):

def is_isogram(string):
    # if not a Str then return False
    if type(string) is not str:
        return False
    
    # if empty then return True
    if len(string)==0:
        return True
    
    # store characters
    db = {}
    
    # loop through the string, but lowercase it first
    for char in string.lower():
        # if it's already been seen, then return False
        if char in db:
            return False
        else:
            # otherwise add to the db
            db[char] = 1
            
    # return True if not failed
    return True

Make it a bit more efficient by using a set:

def is_isogram(string):
    # if not a Str then return False
    if type(string) is not str:
        return False
    
    # if empty then return True
    if len(string)==0:
        return True
    
    # store characters
    db = set()
    
    # loop through the string, but lowercase it first
    for char in string.lower():
        # if it's already been seen, then return False
        if char in db:
            return False
        else:
            # otherwise add to the db
            db.append(char)
            
    # return True if not failed
    return True