鱼C论坛

 找回密码
 立即注册
查看: 1415|回复: 19

[已解决]字符串比较大小疑问

[复制链接]
发表于 2020-7-29 16:30:03 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 萧人也 于 2020-7-29 16:30 编辑

H       E       L       P        

题目:
1.png

以下是本人写的代码:
ageTable='''
    诸葛亮, 28
    刘备, 48
    刘琦, 25
    赵云, 32
    张飞, 43
    关羽, 45
'''
ageTable1=[i.strip() for i in ageTable.splitlines() if i !='']
rather30,less30=[],[]
for i in ageTable1:
        j=i.split(',')
        if j[1]>='30':
                rather30.append(j[0])
        else:
                less30.append(j[0])

print('大于等于30岁的人有:')
for x in rather30:
        print(x)

print('小于30岁的人有:')
for y in less30:
        print(y)

疑问:该代码打印出来的结果是没有大于等于30岁的人,只有小于30岁的人(不信可以拷贝代码试试)。究其原因是if j[1]>'30'出了问题。将该处代码改成if int(j[1])>30后可以打印出大于等于30岁的人。
但本人有个疑问,字符串不是也能比较大小吗?为什么一开始j[1]>'30'返回的都是FALSE结果,像'48'>'30'在python里返回的是True类型,为什么这边就成了FALSE。
求各位大神能支支招!!!
最佳答案
2020-7-29 16:34:10
本帖最后由 Twilight6 于 2020-7-29 16:48 编辑



字符串比较大小的时候比较的是 ASCII 码值的大小,而且是依次比较

只要比较出一个 ASCII 码值的大小的区别就不在进行比较了

你的代码可以稍微改动下如下

正确代码:
ageTable='''
    诸葛亮, 28
    刘备, 48
    刘琦, 25
    赵云, 32
    张飞, 43
    关羽, 45
'''
ageTable1=[i.strip() for i in ageTable.splitlines() if i !='']
ageTable1 = [[i.split(',')[0],int(i.split(',')[1].strip())] for i in ageTable1]

rather30,less30=[],[]
for i in ageTable1:
    if i[1]>=30:
        rather30.append(i[0])
    else:
        less30.append(i[0])

print('大于等于30岁的人有:')
for x in rather30:
        print(x)

print('小于30岁的人有:')
for y in less30:
        print(y)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-29 16:34:10 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Twilight6 于 2020-7-29 16:48 编辑



字符串比较大小的时候比较的是 ASCII 码值的大小,而且是依次比较

只要比较出一个 ASCII 码值的大小的区别就不在进行比较了

你的代码可以稍微改动下如下

正确代码:
ageTable='''
    诸葛亮, 28
    刘备, 48
    刘琦, 25
    赵云, 32
    张飞, 43
    关羽, 45
'''
ageTable1=[i.strip() for i in ageTable.splitlines() if i !='']
ageTable1 = [[i.split(',')[0],int(i.split(',')[1].strip())] for i in ageTable1]

rather30,less30=[],[]
for i in ageTable1:
    if i[1]>=30:
        rather30.append(i[0])
    else:
        less30.append(i[0])

print('大于等于30岁的人有:')
for x in rather30:
        print(x)

print('小于30岁的人有:')
for y in less30:
        print(y)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-29 16:37:13 | 显示全部楼层
本帖最后由 Twilight6 于 2020-7-29 16:39 编辑

比如 '110' 和 '21' 比较

首先比较 '110' 字符串的 '1' 字符,和 '21' 字符串的 '2' 字符

通过查表或者Python  ord 函数得出:
>>> ord('1')
49
>>> ord('2')
50

'2' 字符的 ASCII 码值大于 '1' 字符串,所以字符串'110' 小于字符串 '21'

在比如 '112' 和 '12' 进行比较

因为第一个字符都是 '1' 所以第一次比较 '1' 字符 ASCII 码值相同

所以比较下一个字符,即比较第二个,'112' 的第二个字符为 '1' ,而 '12' 的第二个字符为 '2'

而同上理由可得 ,'1' 的 ASCII 小于 '2' 所以字符串 '12'  > '123'


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

使用道具 举报

发表于 2020-7-29 16:40:36 | 显示全部楼层
本帖最后由 陈尚涵 于 2020-7-29 16:56 编辑

这个帖子写错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-29 16:41:11 | 显示全部楼层
本帖最后由 陈尚涵 于 2020-7-29 16:55 编辑

这个帖子写错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-29 16:44:09 | 显示全部楼层
本帖最后由 陈尚涵 于 2020-7-29 16:55 编辑

这个帖子写错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-29 16:51:04 | 显示全部楼层
本帖最后由 陈尚涵 于 2020-7-29 16:55 编辑


1.你这个rather30,less30 = []用的是同一个id啊,这么写:
rather30 = []
less30 = []

2.你这个逗号后面有个空格啊,应该这么split:
j = i.split(', ')

3.字符串哪有比大小的操作啊,得转换数据类型,这么判断:
if int(j[1])>=30:
        rather30.append(j[0])
    else:
        less30.append(j[0])
改完的代码是这样的:
ageTable='''
    诸葛亮, 28
    刘备, 48
    刘琦, 25
    赵云, 32
    张飞, 43
    关羽, 45
'''
ageTable1=[i.strip() for i in ageTable.splitlines() if i !='']
rather30 = []
less30 = []
for i in ageTable1:
    j = i.split(', ')
    if int(j[1])>=30:
        rather30.append(j[0])
    else:
        less30.append(j[0])

print('大于等于30岁的人有:')
for x in rather30:
    print(x)

print('小于30岁的人有:')
for y in less30:
    print(y)

然后代码就完成了
我需要你的最佳答案!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-29 16:53:27 | 显示全部楼层
本帖最后由 均昊山 于 2020-7-29 16:55 编辑

ageTable={'诸葛亮':'28','刘备':'48','刘琦':'25','赵云':'32','张飞':'43','关羽':'45'}

for eac in ageTable.keys():
    if int(ageTable[eac]) > 30:
        print(eac,ageTable[eac],' ',end='')
        
print('')   

for eac in ageTable.keys():
    if int(ageTable[eac]) < 30:
        print(eac,ageTable[eac],' ',end='')

参考一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-29 16:57:08 | 显示全部楼层
均昊山 发表于 2020-7-29 16:53
ageTable={'诸葛亮':'28','刘备':'48','刘琦':'25','赵云':'32','张飞':'43','关羽':'45'}

for eac in a ...

额,人家只是让你给代码做个修改,你这把代码整体思路怎么都改了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-29 17:00:10 | 显示全部楼层
陈尚涵 发表于 2020-7-29 16:57
额,人家只是让你给代码做个修改,你这把代码整体思路怎么都改了

不然呢,不学学用列表字典数组运用,写那么多,自己定位也不好。换上我这个也好定位,字符串比大少,转成str>str 跟数字排大小一样了~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-29 17:01:34 | 显示全部楼层
均昊山 发表于 2020-7-29 17:00
不然呢,不学学用列表字典数组运用,写那么多,自己定位也不好。换上我这个也好定位,字符串比大少,转成 ...

你看看我的那个帖子,其实也就有点错误,改过来程序还是能正常运行的啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-29 17:02:15 | 显示全部楼层
均昊山 发表于 2020-7-29 17:00
不然呢,不学学用列表字典数组运用,写那么多,自己定位也不好。换上我这个也好定位,字符串比大少,转成 ...

不信你复制我的代码试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-29 17:16:22 | 显示全部楼层
楼主,ASCII码可以是可以,就是太麻烦了,直接用数据类型转换他不香吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-29 17:18:47 | 显示全部楼层
Twilight6 发表于 2020-7-29 16:37
比如 '110' 和 '21' 比较

首先比较 '110' 字符串的 '1' 字符,和 '21' 字符串的 '2' 字符

感谢,找到原因了。是我没注意到数字前面还有个空格的原因,导致跟字符串‘30’比较都是FALSE了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-29 17:20:04 | 显示全部楼层
萧人也 发表于 2020-7-29 17:18
感谢,找到原因了。是我没注意到数字前面还有个空格的原因,导致跟字符串‘30’比较都是FALSE了

但是你还要数据转换啊,你看我的贴了吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-29 17:21:40 | 显示全部楼层
陈尚涵 发表于 2020-7-29 16:51
1.你这个rather30,less30 = []用的是同一个id啊,这么写:

感谢,是我没注意到数字前面还有个空格的原因,导致跟字符串‘30’比较都是FALSE了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-29 17:21:45 | 显示全部楼层
萧人也 发表于 2020-7-29 17:18
感谢,找到原因了。是我没注意到数字前面还有个空格的原因,导致跟字符串‘30’比较都是FALSE了

不数据转换看着难看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-29 17:23:20 | 显示全部楼层
均昊山 发表于 2020-7-29 16:53
ageTable={'诸葛亮':'28','刘备':'48','刘琦':'25','赵云':'32','张飞':'43','关羽':'45'}

for eac in a ...

哈哈,你这样也没毛病
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-29 17:31:01 | 显示全部楼层
陈尚涵 发表于 2020-7-29 17:21
不数据转换看着难看

但至少不转换跑起来这边结果也没错,嗯,最好是数据转换一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-29 18:09:46 | 显示全部楼层
萧人也 发表于 2020-7-29 17:31
但至少不转换跑起来这边结果也没错,嗯,最好是数据转换一下

那就给我设置个最佳答案呗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-19 17:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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