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

Time:01-08

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.

CodePudding user response:

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

CodePudding user response:

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_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 fg'
        print(Solution().highest_scoring_word(p))

What I did was I changed j =j 1 to j=j 1 in line 27

  • Related