提问人: 提问时间:1/8/2023 更新时间:1/9/2023 访问量:109
为什么我的 while 循环计算的字符串值不正确?
Why does my while loop calculate incorrect value of the string?
问:
我试图从字符串中找到单词的最大长度,通过使用字母表中每个字母的值来返回它,方法是根据它的排名分配每个字母的值。例如,对于字符串 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() 将字符串拆分为单词,然后在将每个单词转换为字符数组后,我遍历它以找到它们在字典中的出现并添加到最终值。我希望得到一个字符串的正确值,最后得到一个最大的值。
答:
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()
a
sum()
评论
0赞
1/9/2023
好的,谢谢。我将检查这行代码。另外,出于好奇,我真的很想知道我的原始代码哪里出了问题,因为我花了将近一天的时间在上面,但我仍然无法删除错误。
0赞
user19077881
1/9/2023
我想提出一种解决这些问题的方法。将代码复制到代码中,并可视化代码单步执行和变量更改。https://pythontutor.com/python-debugger.html#mode=edit
评论