鱼C论坛

 找回密码
 立即注册
查看: 1248|回复: 7

[已解决]python的课后作业问题

[复制链接]
发表于 2022-2-28 19:38:20 | 显示全部楼层 |阅读模式
5鱼币
  1. first = "q w e r t y u i o p"
  2. second = "a s d f g h j k l"
  3. third = "z x c v b n m"
  4. first_1 = first.split()
  5. First_1 = first.upper().split()
  6. second_1 = second.split()
  7. Second_1 = second.upper().split()
  8. third_1 = third.split()
  9. Third_1 = third.upper().split()
  10. words = ["Twitter", "TOTO", "FishC", "Python", "ASL"]
  11. result = []
  12. a = 0
  13. b = 0
  14. c = 0
  15. for each in words:
  16.     print(each)
  17.     for i in each:
  18.         if i.startswith(tuple(first_1)) or i.startswith(tuple(First_1)):
  19.             a = 1
  20.             continue
  21.         elif i.startswith(tuple(second_1)) or i.startswith(tuple(Second_1)):
  22.             b = 1
  23.             continue
  24.         elif i.startswith(tuple(third_1)) or i.startswith(tuple(Third_1)):
  25.             c = 1
  26.             continue
  27.     if a == 1 and b == 0 and c == 0:
  28.         result.append(each)
  29.     elif a == 0 and b == 1 and c == 0:
  30.         result.append(each)
  31.     elif a == 0 and b == 0 and c == 1:
  32.         result.append(each)
  33.     else:
  34.         continue
  35. print("输出",result)


复制代码


求问各位大佬:
1.为什么这个结果里没有ASL 按理说ASL也是满足条件的 我实在找不出来错误
最佳答案
2022-2-28 19:38:21
本帖最后由 isdkz 于 2022-2-28 21:49 编辑


你的思路没有问题,不过有一些建议:
第一:没必要把大写和小写分开,你可以先用 lower() 把大写变成小写

第二:i 只是一个字符,你直接用 in 即可,没必要用 startswith

第三:对于这种判断有一个更好用的函数:

all: 接收一个可迭代对象,可迭代对象全为 True 时返回True

小技巧:python给函数传生成器生成式时,可以把函数调用的括号跟生成器生成式的括号共用

第四:循环体的最后本来就要进入下一次循环了,没必要加 continue

故对你的代码修改如下:
  1. first = "qwertyuiop"
  2. second = "asdfghjkl"
  3. third =  "zxcvbnm"
  4. words = ["Twitter", "TOTO", "FishC", "Python", "ASL"]
  5. result = []

  6. for each in words:
  7.     print(each)
  8.     if all(i.lower() in first for i in each):
  9.         result.append(each)
  10.     elif all(i.lower() in second for i in each):
  11.         result.append(each)
  12.     elif all(i.lower() in third for i in each):
  13.         result.append(each)

  14. print("输出",result)
复制代码

最佳答案

查看完整内容

你的思路没有问题,不过有一些建议: 第一:没必要把大写和小写分开,你可以先用 lower() 把大写变成小写 第二:i 只是一个字符,你直接用 in 即可,没必要用 startswith 第三:对于这种判断有一个更好用的函数: all: 接收一个可迭代对象,可迭代对象全为 True 时返回True 小技巧:python给函数传生成器生成式时,可以把函数调用的括号跟生成器生成式的括号共用 第四:循环体的最后本来就要进入下一次循环了 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-28 19:38:21 | 显示全部楼层    本楼为最佳答案   
本帖最后由 isdkz 于 2022-2-28 21:49 编辑


你的思路没有问题,不过有一些建议:
第一:没必要把大写和小写分开,你可以先用 lower() 把大写变成小写

第二:i 只是一个字符,你直接用 in 即可,没必要用 startswith

第三:对于这种判断有一个更好用的函数:

all: 接收一个可迭代对象,可迭代对象全为 True 时返回True

小技巧:python给函数传生成器生成式时,可以把函数调用的括号跟生成器生成式的括号共用

第四:循环体的最后本来就要进入下一次循环了,没必要加 continue

故对你的代码修改如下:
  1. first = "qwertyuiop"
  2. second = "asdfghjkl"
  3. third =  "zxcvbnm"
  4. words = ["Twitter", "TOTO", "FishC", "Python", "ASL"]
  5. result = []

  6. for each in words:
  7.     print(each)
  8.     if all(i.lower() in first for i in each):
  9.         result.append(each)
  10.     elif all(i.lower() in second for i in each):
  11.         result.append(each)
  12.     elif all(i.lower() in third for i in each):
  13.         result.append(each)

  14. print("输出",result)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-28 19:55:38 | 显示全部楼层
因为你的a,b,c 没有重新置为0,对 a、b、c 的赋值应该在循环里面:
  1. first = "q w e r t y u i o p"
  2. second = "a s d f g h j k l"
  3. third = "z x c v b n m"
  4. first_1 = first.split()
  5. First_1 = first.upper().split()
  6. second_1 = second.split()
  7. Second_1 = second.upper().split()
  8. third_1 = third.split()
  9. Third_1 = third.upper().split()
  10. words = ["Twitter", "TOTO", "FishC", "Python", "ASL"]
  11. result = []

  12. for each in words:
  13.     a = 0                 # 注意这里
  14.     b = 0                 # 注意这里
  15.     c = 0                 # 注意这里
  16.     print(each)
  17.     for i in each:
  18.         if i.startswith(tuple(first_1)) or i.startswith(tuple(First_1)):
  19.             a = 1
  20.             continue
  21.         elif i.startswith(tuple(second_1)) or i.startswith(tuple(Second_1)):
  22.             b = 1
  23.             continue
  24.         elif i.startswith(tuple(third_1)) or i.startswith(tuple(Third_1)):
  25.             c = 1
  26.             continue
  27.     if a == 1 and b == 0 and c == 0:
  28.         result.append(each)
  29.     elif a == 0 and b == 1 and c == 0:
  30.         result.append(each)
  31.     elif a == 0 and b == 0 and c == 1:
  32.         result.append(each)
  33.     else:
  34.         continue
  35. print("输出",result)


复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-2-28 20:07:29 | 显示全部楼层
isdkz 发表于 2022-2-28 19:55
因为你的a,b,c 没有重新置为0,对 a、b、c 的赋值应该在循环里面:

啊!!!明白了 谢谢 其他还有啥问题吗 这个思路是对的吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-28 20:26:41 | 显示全部楼层
1370607278 发表于 2022-2-28 20:07
啊!!!明白了 谢谢 其他还有啥问题吗 这个思路是对的吧?

我不知道你的题我也没法说你的思路对不对呀,

我也是调试了好一会儿才知道你想干嘛
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-2-28 21:08:59 | 显示全部楼层
isdkz 发表于 2022-2-28 20:26
我不知道你的题我也没法说你的思路对不对呀,

我也是调试了好一会儿才知道你想干嘛

这是题目:


美式键盘中:

第一行由字符 "qwertyuiop" 组成
第二行由字符 "asdfghjkl" 组成
第三行由字符 "zxcvbnm" 组成

举例:

输入:words = ["Twitter", "TOTO", "FishC", "Python", "ASL"]
输出:['Twitter', 'TOTO', 'ASL']

把这个例子写出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-2-28 21:47:43 | 显示全部楼层
isdkz 发表于 2022-2-28 21:44
你的思路没有问题,不过有一些建议:
第一:没必要把大写和小写分开,你可以先用 lower() 把大写变成 ...

好的谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-28 21:50:12 | 显示全部楼层

不客气,我又改了一下,加了第四点,你看一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-15 01:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表