Why does my while loop calculate incorrect value of the string?

Question:

I am trying to find greatest length of a word from the string return it by using values of each letter from alphabets by assigning each letter it’s value as per it’s rank . So for example For a string s = ‘abcd a’, I intend to return 10 [a=1 + b=2 + c =3 + d=4] .But, I am getting output as 7 When I debugged the code, I noticed that in while loop my code skips i=2 and directly jumps on i=3. Where am I going wrong? Below is my code.

class Solution(object):

    def highest_scoring_word(self,s):

        # Dictionary of English letters
      dt = {'a':1,'b':2,'c':3,'d':4,'e':5,'f':6,
            'g':7,'h':8,'i':9,'j':10,'k':11,'l':12,
            'm':13,'n':14,'o':15,'p':16,'q':17,
            'r':18,'s':19,'t':20,'u':21,'v':22,
            'w':23,'x':24,'y':25,'z':26}
      value_sum =0
      max_value =value_sum
      for i in range(0,len(s)):
          if s.upper():
              s= s.lower()
              words = s.split()

              # convert the string in char array
              to_char_array = list(words[i])
              j=0
              while j<len(to_char_array):
                  if to_char_array[j] in dt.keys() :
                        value_sum = max(dt.get(to_char_array[j]),value_sum + dt.get(to_char_array[j]))
                        max_value = max(value_sum,max_value)
                  else:
                      pass
                  j +=j+1
              return max_value

if __name__ == '__main__':
    p = 'abcd a'
    print(Solution().highest_scoring_word(p))

`

I have created a dictionary where I have stored all letters in english alphabet and their values and later I have split the string into words using split() and then after converting each individual word into character array I have traversed it to find their occurrence in the dictionary and add to the final value. I am expecting to get a correct value of a string and finally the greatest value.

Asked By: Niklaus

||

Answers:

Try using this:

class Solution(object):

    def highest_scoring_word(self,s):

        # Dictionary of English letters
      dt = {'a':1,'b':2,'c':3,'d':4,'e':5,'f':6,
            'g':7,'h':8,'i':9,'j':10,'k':11,'l':12,
            'm':13,'n':14,'o':15,'p':16,'q':17,
            'r':18,'s':19,'t':20,'u':21,'v':22,
            'w':23,'x':24,'y':25,'z':26}
      value_sum1 =0
      max_value1 =value_sum1
      value_sum2 =0
      max_value2 =value_sum2
      for i in range(0,len(s)):
          if s.upper():
              s= s.lower()
              words = s.split()


              # convert the string in char array
              to_char_array = list(words[0])

              j=0
              while j<len(to_char_array):
                  if to_char_array[j] in dt.keys() :
                        value_sum1 = max(dt.get(to_char_array[j]),value_sum1 + dt.get(to_char_array[j]))
                        max_value1 = max(value_sum1,max_value1)
                  else:
                      pass
                  j=j+1
        
              to_char_array = list(words[1])

              j=0
              while j<len(to_char_array):
                  if to_char_array[j] in dt.keys() :
                        value_sum2 = max(dt.get(to_char_array[j]),value_sum2 + dt.get(to_char_array[j]))
                        max_value2 = max(value_sum2,max_value2)
                  else:
                      pass
                  j=j+1
              if max_value2>max_value1:
                      return max_value2
              elif max_value1>max_value2:
                      return max_value1
              else:
                      return 'Both words have equal score'

if __name__ == '__main__':
    p = 'abcd abcd'
    print(Solution().highest_scoring_word(p))
Answered By: Retro_Zapper

As you are using a class and methods, make use of them:

from string import ascii_lowercase as dt


class Solution(object):

    def __init__(self, data):
        self.scores = {}
        self.words = data.lower().strip().split()

    def get_scoring(self):
        # for each word caculate the scoring
        for word in self.words:
            score = 0
            # for each character in the word, find its index in 'a..z' and add it to score
            # same as in your dt implementation (just using index not absolute values)
            for c in word:
                score += dt.find(c) + 1
            self.scores[word] = score
        print(self.scores)
        # filer the dictionary by its greates value in order to get the word with max score:
        return max(self.scores.keys(), key=lambda k: self.scores[k])


if __name__ == '__main__':
    p = 'abcd fg11'
    maxWord = Solution(p).get_scoring()
    print(maxWord)

Out:

{'abcd': 10, 'fg11': 13}
fg11
Answered By: Maurice Meyer

It is maybe of interest that the code can be greatly simplified by using features available in Python:

the_sum = sum(ord(c)-96 for c in s.lower() if c.isalpha())

to break this down. for c in s.lower() gets the lower-case characters one by one; the function ord() gives the numerical value with a of 97 so we subtract to get 1. Then we check if the character is a letter and if so accept it. Then sum() adds up all the numbers. You could break up this one line an check how the separate parts work.

Answered By: user19077881