Python Forum

Full Version: writing a function for isogram
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
I need to write program that checks if a word supplied as the argument is an Isogram. An Isogram is a word in which no letter occurs more than once.
Create a method called is_isogram that takes one argument, a word to test if it's an isogram. This method should return a tuple of the word and a boolean indicating whether it is an isogram. If the argument supplied is an empty string, return the argument and False: (argument, False). If the argument supplied is not a string, raise a TypeError with the message  'Argument should be a string'

This is the code i created


def is_isogram(word):
    if type(word) == str:
      for i in word:
        if word.count(i) >1 or word == "":
          return (word, False)
        else:
          return (word, True)
    else:
      raise TypeError ("'{}' should be a string" .format(word))
And this is the test code


from unittest import TestCase

class IsogramTestCases(TestCase):
  def test_checks_for_isograms(self):
    word = 'abolishment'
    self.assertEqual(
      is_isogram(word),
      (word, True),
      msg="Isogram word, '{}' not detected correctly".format(word)
    )

  def test_returns_false_for_nonisograms(self):
    word = 'alphabet'
    self.assertEqual(
      is_isogram(word),
      (word, False),
      msg="Non isogram word, '{}' falsely detected".format(word)
    )

  def test_it_only_accepts_strings(self):
    with self.assertRaises(TypeError) as context:
      is_isogram(2)
      self.assertEqual(
        'Argument should be a string',
        context.exception.message,
        'String inputs allowed only'
      )
The code runs well but when I want to test it against the test code. It gives me the error code
NameError Global name is_isogram not defined.

kindly help
is_isogram() should be defined in the same source file, or you should "import" the source file that contains it.
One note:
isogram is also used by some to mean a word or phrase in which each letter appears the same number of times, not necessarily just once.
Also, your is_isogram function won't work right. You should only return true if none of the letters returns false.
1) import the file. That'll solve this issue, but there are others you'll run into once you do that.

2) Why are you type checking? And why are you checking specifically against str? Why not allow any iterable of items that support __eq__? By limiting the function to just strings, you're eliminating a lot of the benefit that python's typing brings to the table.