澍梵. 发表于 2020-4-19 11:10:18

自己的代码找不出错误原因

【问题描述】
小明对类似于 hello 这种单词非常感兴趣,这种单词可以正好分为四段,第一段由一个或多个辅音字母组成,第二段由一个或多个元音字母组成,第三段由一个或多个辅音字母组成,第四段由一个或多个元音字母组成。 给定一个单词,请判断这个单词是否也是这种单词,如果是请输出yes,否则请输出no。 元音字母包括 a, e, i, o, u,共五个,其他均为辅音字母。
【样例输入】 lanqiao
【样例输出】 yes
【样例输入】world
【样例输出】no
原题的正确代码:
if __name__ == '__main__':
    word = input().strip()
    h =
    # 首字母不能是元音尾字母不能是辅音
    if h == 1 or h[-1] == 0:
      print('no')
      exit()
    cnt = len( + h == 1])
    print('yes') if cnt == 3 else print('no')


自己写的代码:
I=input().split()
if I not in "aeiou" or I[-1] in "aeiou":
    for i in range(1,len(I)-2):
      if I in "aeiou" and I[-2] not in "aeiou":
            print("yes")
      else:
            print("no")
else:
    print("no")

感觉错误的地方:
for i in range(1,len(I)-2):
      if I in "aeiou" and I[-2] not in "aeiou":
            print("yes")
      else:
            print("no")

我认为错误是在对单词非首尾字母的确定上。
我的思路是单词2-倒数2的字母中有一个是aeiou,且倒数第二个字母非aeiou可以 。
但自己写出来了,判断结果却总是错的。自己找不到错误原因,希望各位大佬能帮我找下错误原因。

txxcat 发表于 2020-4-19 11:46:55

首先第一句不对,要改成I=input().split('')才能把你的输入单词转换为独立字母的列表。其实列表和字符串在这里的应用是完全一样的,也就是说I=input(),也是一样的结果。其次,你在for循环里做判断打印,循环多少次,就会打印多少次,肯定不是你需要的,你再试试。

悠悠2264 发表于 2020-4-19 12:35:02

本帖最后由 悠悠2264 于 2020-4-19 12:39 编辑

1.split()是把输入的按空格切开来,返回一个列表。后面for循环时len(i)返回的是列表的长度,不是字符串的长度,因此就不会执行for循环。所以不需要这个split()
2.你这个只能判断首尾字符是否符合,中间字符和倒数第二个是元音还是辅音,并不符合题目要求的判断辅元辅元(一个或多个字母)。
这个是正确代码:
r=input()
num = 0 #num用来记录元辅次数
for i in range(len(r)): #迭代字符索引
    if i == 0: #判断是否为第一个字符
      if r != 'aeiou': #判断第一个字符是否是元音字母,是num+1并退出此次循环,否不加并退出循环
            num +=1
            continue
    else:
      break
    if (r in 'aeiou') == (r in 'aeiou'): #判断是否和前一个字母的元辅相等,相等则退出此次循环
      continue
    num+=1 #不相等则num+1
if(num == 4): #num等于4,格式就是元辅元辅,打印yes,否则打印no
    print("yes")
else:
    print("no")

澍梵. 发表于 2020-4-19 15:47:49

txxcat 发表于 2020-4-19 11:46
首先第一句不对,要改成I=input().split('')才能把你的输入单词转换为独立字母的列表。其实列表和字符串在 ...

感谢开头确实就以及错了,但不能用split()来切分,要用strip()来对输入进行切分

澍梵. 发表于 2020-4-19 15:52:20

悠悠2264 发表于 2020-4-19 12:35
1.split()是把输入的按空格切开来,返回一个列表。后面for循环时len(i)返回的是列表的长度,不是字符串的长 ...

感谢给予我的帮助,你修改后的代码还是有错误的,题干中说单词的第二段由一个或多个元音字母组成,第三段由一个或多个辅音字母组成来确定是否为与hello类似的单词,而不是通过判断是否和前一个字母的元辅相等来确定。不过你的代码给了我很大的启发,我已经自己修改好了,感谢

txxcat 发表于 2020-4-19 16:13:56

澍梵. 发表于 2020-4-19 15:47
感谢开头确实就以及错了,但不能用split()来切分,要用strip()来对输入进行切分

strip()是去掉前后空格,标答其实就是对字符串本身进行操纵。

悠悠2264 发表于 2020-4-19 17:04:17

澍梵. 发表于 2020-4-19 15:52
感谢给予我的帮助,你修改后的代码还是有错误的,题干中说单词的第二段由一个或多个元音字母组成,第三段 ...

第一段是辅音,那么第二段和第一段不一样,就肯定是元音;第三段和第二段不一样,就是辅音;第四段和第三段不一样,就是元音。这样看是可以的,样例输入输出也都是正确的

澍梵. 发表于 2020-4-19 18:39:56

悠悠2264 发表于 2020-4-19 17:04
第一段是辅音,那么第二段和第一段不一样,就肯定是元音;第三段和第二段不一样,就是辅音;第四段和第 ...

嗯 好,我在看看,谢谢了

澍梵. 发表于 2020-4-19 18:40:41

txxcat 发表于 2020-4-19 16:13
strip()是去掉前后空格,标答其实就是对字符串本身进行操纵。

嗯 感谢
页: [1]
查看完整版本: 自己的代码找不出错误原因