萧人也 发表于 2020-7-29 16:30:03

字符串比较大小疑问

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

H       E       L       P      {:5_105:} {:5_105:} {:5_105:}

题目:


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

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

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

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

Twilight6 发表于 2020-7-29 16:34:10

本帖最后由 Twilight6 于 2020-7-29 16:48 编辑



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

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

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

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

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

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

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

Twilight6 发表于 2020-7-29 16:37:13

本帖最后由 Twilight6 于 2020-7-29 16:39 编辑

比如 '110' 和 '21' 比较

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

通过查表或者Pythonord 函数得出:
>>> 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'


陈尚涵 发表于 2020-7-29 16:40:36

本帖最后由 陈尚涵 于 2020-7-29 16:56 编辑

这个帖子写错了

陈尚涵 发表于 2020-7-29 16:41:11

本帖最后由 陈尚涵 于 2020-7-29 16:55 编辑

这个帖子写错了

陈尚涵 发表于 2020-7-29 16:44:09

本帖最后由 陈尚涵 于 2020-7-29 16:55 编辑

这个帖子写错了

陈尚涵 发表于 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)>=30:
      rather30.append(j)
    else:
      less30.append(j)
改完的代码是这样的:
ageTable='''
    诸葛亮, 28
    刘备, 48
    刘琦, 25
    赵云, 32
    张飞, 43
    关羽, 45
'''
ageTable1=
rather30 = []
less30 = []
for i in ageTable1:
    j = i.split(', ')
    if int(j)>=30:
      rather30.append(j)
    else:
      less30.append(j)

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

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


然后代码就完成了
我需要你的最佳答案!!!

均昊山 发表于 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) > 30:
      print(eac,ageTable,' ',end='')
      
print('')   

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

参考一下

陈尚涵 发表于 2020-7-29 16:57:08

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

for eac in a ...

额,人家只是让你给代码做个修改,你这把代码整体思路怎么都改了{:10_277:}

均昊山 发表于 2020-7-29 17:00:10

陈尚涵 发表于 2020-7-29 16:57
额,人家只是让你给代码做个修改,你这把代码整体思路怎么都改了

不然呢,不学学用列表字典数组运用,写那么多,自己定位也不好。换上我这个也好定位,字符串比大少,转成str>str 跟数字排大小一样了~

陈尚涵 发表于 2020-7-29 17:01:34

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

你看看我的那个帖子,其实也就有点错误,改过来程序还是能正常运行的啊

陈尚涵 发表于 2020-7-29 17:02:15

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

不信你复制我的代码试试

陈尚涵 发表于 2020-7-29 17:16:22

楼主,ASCII码可以是可以,就是太麻烦了,直接用数据类型转换他不香吗?

萧人也 发表于 2020-7-29 17:18:47

Twilight6 发表于 2020-7-29 16:37
比如 '110' 和 '21' 比较

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


感谢,找到原因了。是我没注意到数字前面还有个空格的原因,导致跟字符串‘30’比较都是FALSE了{:5_104:}

陈尚涵 发表于 2020-7-29 17:20:04

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

但是你还要数据转换啊,你看我的贴了吗{:10_257:}

萧人也 发表于 2020-7-29 17:21:40

陈尚涵 发表于 2020-7-29 16:51
1.你这个rather30,less30 = []用的是同一个id啊,这么写:




感谢,是我没注意到数字前面还有个空格的原因,导致跟字符串‘30’比较都是FALSE了{:5_104:}

陈尚涵 发表于 2020-7-29 17:21:45

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

不数据转换看着难看

萧人也 发表于 2020-7-29 17:23:20

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

for eac in a ...

哈哈,你这样也没毛病{:10_277:}

萧人也 发表于 2020-7-29 17:31:01

陈尚涵 发表于 2020-7-29 17:21
不数据转换看着难看

但至少不转换跑起来这边结果也没错,嗯,最好是数据转换一下

陈尚涵 发表于 2020-7-29 18:09:46

萧人也 发表于 2020-7-29 17:31
但至少不转换跑起来这边结果也没错,嗯,最好是数据转换一下

那就给我设置个最佳答案呗{:10_254:}
页: [1]
查看完整版本: 字符串比较大小疑问