为什么我的 while 循环计算的字符串值不正确?

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

提问人: 提问时间:1/8/2023 更新时间:1/9/2023 访问量:109

问:

我试图从字符串中找到单词的最大长度,通过使用字母表中每个字母的值来返回它,方法是根据它的排名分配每个字母的值。例如,对于字符串 s = 'abcd a',我打算返回 10 [a=1 + b=2 + c =3 + d=4] 。但是,当我调试代码时,我得到的输出为 7,我注意到在 while 循环中,我的代码跳过 i=2 并直接跳转到 i=3。我哪里出错了?下面是我的代码。

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))

`

我创建了一个字典,其中我存储了所有英文字母及其值,后来我使用 split() 将字符串拆分为单词,然后在将每个单词转换为字符数组后,我遍历它以找到它们在字典中的出现并添加到最终值。我希望得到一个字符串的正确值,最后得到一个最大的值。

python-3.x 字符串 数据结构 while 循环

评论


答:

0赞 Retro_Zapper 1/8/2023 #1

尝试使用这个:

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()
              if len(words)>1:
                  # 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'
              else:
                      # 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_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
                      return max_value1

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

评论

0赞 Retro_Zapper 1/8/2023
在第 14 行中,您可能正在考虑使用 但是,如果您这样做,则必须给出 else 语句来捕捉字符串 s 不是大写字母的时间if s.isupper():
0赞 1/8/2023
但是在这里,如果我使用输入“abcd fg”,我应该得到 13 作为输出,因为 [f=6,g=7],但我仍然得到 10
0赞 Retro_Zapper 1/8/2023
如果删除输入“abcd fg”之间的空格并将其更改为“abcdfg”,则可以工作。由于您试图找到得分最高的单词,因此在中间添加一个空格会使其成为两个单词,因此会产生问题。如果您想找到得分最高的单词,当它之间有空格时,请发表评论,我会尝试为该:)找到解决方案
0赞 1/9/2023
是的,当它有空格时,我确实想找到最高分,并且我想通过我编写的代码来获得它。
0赞 Retro_Zapper 1/9/2023
“ABCD FG”应该给出 23 而不是 13
1赞 Maurice Meyer 1/8/2023 #2

当您使用类和方法时,请使用它们:

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)

外:

{'abcd': 10, 'fg11': 13}
fg11

评论

0赞 1/8/2023
我不太擅长使用 lambda,你能解释一下我的代码哪里出了问题吗?
0赞 Maurice Meyer 1/8/2023
@Niklaus:编辑列表推导式并将其更改为常规循环:)
0赞 1/8/2023
我会经历的,谢谢。你能给我一些博客,让我在lambdas方面做得更好吗?我真的觉得他们不舒服。谢谢
0赞 Maurice Meyer 1/8/2023
realpython.com
0赞 1/8/2023
谢谢,如果你不介意的话,你能说出我在原始代码中哪里出错吗?我按照@Retro_Zapper给出的建议进行了更改,当我使用此输入“abcd fg”时,它给了我 10 而不是 13。我调试了它,发现我的 while 循环不检查“fg”字。
0赞 user19077881 1/8/2023 #3

通过使用 Python 中可用的功能可以大大简化代码,这可能很有趣:

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

来分解这一点。 逐个获取小写字符;该函数给出的数值为 97,因此我们减去得到 1。然后我们检查该字符是否为字母,如果是,请接受它。然后将所有数字相加。您可以将这一行拆分,检查各个部分的工作方式。for c in s.lower()ord()asum()

评论

0赞 1/9/2023
好的,谢谢。我将检查这行代码。另外,出于好奇,我真的很想知道我的原始代码哪里出了问题,因为我花了将近一天的时间在上面,但我仍然无法删除错误。
0赞 user19077881 1/9/2023
我想提出一种解决这些问题的方法。将代码复制到代码中,并可视化代码单步执行和变量更改。https://pythontutor.com/python-debugger.html#mode=edit