鱼C论坛

 找回密码
 立即注册
查看: 2554|回复: 5

[已解决]Python第27节,最后一题!

[复制链接]
发表于 2023-2-20 22:37:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
s = "a1b2c3"
s_list = []
for i in s:
    s_list.append(i)
final = []

for i in range(len(s_list)):
    if i % 2 == 0:
        final.append(s_list[i])
    if i % 2 != 0:
        if (ord(s_list[i-1]) + int(s_list[i])) <= 122:
            s_list[i] = chr(ord(s_list[i-1])+int(s_list[i]))
            final.append(s_list[i])
    if i % 2 != 0:
        if (ord(s_list[i-1]) + int(s_list[i])) > 122:
            s_list[i] = chr(ord(s_list[i-1])+int(s_list[i]) - 122 + 96)
            final.append(s_list[i])

print(final)

这是我写的代码?
为什么总是报错,提示如下:
line 15, in <module>
if (ord(s_list[i-1]) + int(s_list[i])) > 122:
ValueError: invalid literal for int() with base 10: 'b'

按我设置的条件,字母不会进入后面两个if模块呀?
求各位朋友解答一下!!
最佳答案
2023-2-20 22:58:21
明面上看是字母不会进入后面的两个 if 语句,其实准确地说是索引为偶数的不会进入后面的两个 if 语句,

但你的索引为 1 的时候进入后面的两个 if 语句中的第一个,然后在这里 s_list[1] 被改成了字母,

然后接着进入了最后一个 if 语句,这字母可不就进入后面的两个 if 语句中的一个了么,

所以你不应该写两个 if i % 2 != 0,而且因为 (ord(s_list[i-1]) + int(s_list[I])) <= 122 与 (ord(s_list[i-1]) + int(s_list[I])) > 122 是互斥的两个条件,所以用 else 就可以了,

对你的代码修改如下:
s = "a1b2c3"
s_list = []
for i in s:
    s_list.append(i)
final = []

for i in range(len(s_list)):
    if i % 2 == 0:
        final.append(s_list[i])
    if i % 2 != 0:
        if (ord(s_list[i-1]) + int(s_list[i])) <= 122:
            s_list[i] = chr(ord(s_list[i-1])+int(s_list[i]))
            final.append(s_list[i])
        else:
            s_list[i] = chr(ord(s_list[i-1])+int(s_list[i]) - 122 + 96)
            final.append(s_list[i])

print(final)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-2-20 22:41:40 | 显示全部楼层

回帖奖励 +1 鱼币

在这段代码中,出现了一个错误,即在执行第二个if语句时,当它的上一个字符是字母而不是数字时,将引发ValueError异常。这是因为尝试将字母转换为整数时会引发异常。

这个问题可以通过在第二个if语句之前添加一个检查来解决,以确保上一个字符是数字而不是字母。此外,还需要将条件中的数字122替换为字母'z'的ASCII码值,以确保当相加的值超出字母表范围时,将它们映射回字母表的末尾。

以下是修正后的代码:
s = "a1b2c3"
s_list = []
for i in s:
    s_list.append(i)
final = []

for i in range(len(s_list)):
    if i % 2 == 0:
        final.append(s_list[i])
    if i % 2 != 0:
        if i > 0 and s_list[i-1].isdigit() and (ord(s_list[i-1]) + int(s_list[i])) <= ord('z'):
            s_list[i] = chr(ord(s_list[i-1])+int(s_list[i]))
            final.append(s_list[i])
        elif i > 0 and s_list[i-1].isdigit() and (ord(s_list[i-1]) + int(s_list[i])) > ord('z'):
            s_list[i] = chr(ord(s_list[i-1])+int(s_list[i]) - ord('z') + ord('a') - 1)
            final.append(s_list[i])

print(final)
现在,代码应该可以正确运行并输出['a', 'b', 'd', 'c', 'f'].
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-2-20 22:44:39 | 显示全部楼层

回帖奖励 +1 鱼币

本帖最后由 ExiaGN001 于 2023-2-20 22:46 编辑

我自己RTFW了一下,发现确实,
PY里字母转整数会报错。
那么就在第二/第三个if里加一个判定是不是字母的if就行喽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-20 22:58:21 | 显示全部楼层    本楼为最佳答案   

回帖奖励 +1 鱼币

明面上看是字母不会进入后面的两个 if 语句,其实准确地说是索引为偶数的不会进入后面的两个 if 语句,

但你的索引为 1 的时候进入后面的两个 if 语句中的第一个,然后在这里 s_list[1] 被改成了字母,

然后接着进入了最后一个 if 语句,这字母可不就进入后面的两个 if 语句中的一个了么,

所以你不应该写两个 if i % 2 != 0,而且因为 (ord(s_list[i-1]) + int(s_list[I])) <= 122 与 (ord(s_list[i-1]) + int(s_list[I])) > 122 是互斥的两个条件,所以用 else 就可以了,

对你的代码修改如下:
s = "a1b2c3"
s_list = []
for i in s:
    s_list.append(i)
final = []

for i in range(len(s_list)):
    if i % 2 == 0:
        final.append(s_list[i])
    if i % 2 != 0:
        if (ord(s_list[i-1]) + int(s_list[i])) <= 122:
            s_list[i] = chr(ord(s_list[i-1])+int(s_list[i]))
            final.append(s_list[i])
        else:
            s_list[i] = chr(ord(s_list[i-1])+int(s_list[i]) - 122 + 96)
            final.append(s_list[i])

print(final)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-20 22:58:22 | 显示全部楼层
ouyunfu 发表于 2023-2-20 22:41
在这段代码中,出现了一个错误,即在执行第二个if语句时,当它的上一个字符是字母而不是数字时,将引发Valu ...

我把你的代码跑了一遍,答案是s_list = ['a', '1', 'b', '2', 'c', '3']
跟原s_list是一样的,我想了一下是这个循环,应该没进入后面两个IF模块
我的想法是利用前面一个字母加上后面的数字之和,再用ord转换成字母
例如:chr(ord('a') + 1) = 'b'
如果按照你修改的判定条件,要满足不是字母才能进入IF模块,所以修改过的程序应该没计算奇数的情况,所以跟原s_list一模一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-20 23:15:10 | 显示全部楼层
isdkz 发表于 2023-2-20 22:58
明面上看是字母不会进入后面的两个 if 语句,其实准确地说是索引为偶数的不会进入后面的两个 if 语句,

...

谢谢大佬,看来思路没问题,问题出在最基础的分支和循环,回去再复习一下,已经看懂了,谢谢!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-24 13:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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