鱼C论坛

 找回密码
 立即注册
查看: 2742|回复: 10

[已解决]大佬们帮忙康康这个代码怎么会出现这种BUG

[复制链接]
发表于 2021-10-3 09:29:35 | 显示全部楼层 |阅读模式

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

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

x
import operator

def v_split(v1,v2):
    """比较两个版本号,结果返回最新版本号"""
    sp_1 = [int(x) for x in v1.split('.')]
    sp_2 = [int(x) for x in v2.split('.')]

    len_p = len(sp_1) - len(sp_2)
    if len_p > 0:
        sp_2.extend([0] * len_p)

    elif len_p < 0:
        sp_1.extend([0] * (-len_p))

    for i,p in enumerate(sp_1):
        ret = operator.eq(p,sp_2[i])#版本号1与版本号2等值
        reb = operator.gt(p,sp_2[i])#版本号1比版本号2大
        red = operator.lt(p,sp_2[i])#版本号2比版本号1大

        if ret:
            print('v1 = v2')
            break

        elif reb:
            print('v1')
            break

        else:
            print('v2')
            break


v1 = input("请输入第一个版本号: ")
v2 = input("请输入第二个版本号: ")
v_split(v1,v2)

测试结果:
请输入第一个版本号: 1.1.1
请输入第二个版本号: 1.2
v1 = v2
乌鱼子,为什么会出现这种情况呢,大佬们,帮帮孩子吧,谢谢啦
最佳答案
2021-10-3 10:12:35
qwe2052190 发表于 2021-10-3 10:01
import operator

def v_split(v1,v2):


你都用这个模块了
直接比较就好了
  1. import operator


  2. def v_split(v1, v2):
  3.     # """比较两个版本号,结果返回最新版本号"""
  4.     # sp_1 = [int(x) for x in v1.split('.')]
  5.     # sp_2 = [int(x) for x in v2.split('.')]

  6.     # len_p = len(sp_1) - len(sp_2)
  7.     # if len_p > 0:
  8.     #     sp_2.extend([0] * len_p)

  9.     # elif len_p < 0:
  10.     #     sp_1.extend([0] * (-len_p))

  11.     # if operator.lt(sp_1, sp_2):
  12.     #     print("v2:", sp_2)

  13.     # elif operator.gt(sp_1, sp_2):
  14.     #     print('v1:', sp_1)

  15.     # else:
  16.     #     print('v1 = v2')
  17. # -------------------------------------------
  18.     if operator.lt(v1, v2):
  19.         print("v2:", v2)
  20.     elif operator. gt(v1, v2):
  21.         print("v1:", v1)
  22.     else:
  23.         print('v1 = v2')


  24. v1 = input("请输入第一个版本号: ")
  25. v2 = input("请输入第二个版本号: ")
  26. v_split(float(v1), float(v2))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-10-3 10:01:35 | 显示全部楼层
import operator

def v_split(v1,v2):
    """比较两个版本号,结果返回最新版本号"""
    sp_1 = [int(x) for x in v1.split('.')]
    sp_2 = [int(x) for x in v2.split('.')]

    len_p = len(sp_1) - len(sp_2)
    if len_p > 0:
        sp_2.extend([0] * len_p)

    elif len_p < 0:
        sp_1.extend([0] * (-len_p))

    if operator.lt(sp_1,sp_2):
        print("v2")

    elif operator.gt(sp_1,sp_2):
        print('v1')

    else:
        print('v1 = v2')

v1 = input("请输入第一个版本号: ")
v2 = input("请输入第二个版本号: ")
v_split(v1,v2)

后面查了下operator模块的用法,好像可以这样直接调用,也不知道这样改进可以吗,求大佬帮忙康康
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-3 10:06:03 | 显示全部楼层
import operator

def v_split(v1,v2):
    """比较两个版本号,结果返回最新版本号"""
    sp_1 = [int(x) for x in v1.split('.')]
    sp_2 = [int(x) for x in v2.split('.')]

   

    if operator.lt(sp_1,sp_2):
        print("v2")

    elif operator.gt(sp_1,sp_2):
        print('v1')

    else:
        print('v1 = v2')

            
           


v1 = input("请输入第一个版本号: ")
v2 = input("请输入第二个版本号: ")
v_split(v1,v2)
        
擦,突然发现operator的功能如此强大,貌似不需要把俩列表等长了,可以直接比较大小了,这特么帅呆了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-3 10:10:14 | 显示全部楼层
代码:
  1. import operator

  2. def comparison(v1, v2):
  3.     ver1 = [int(i) for i in v1.split('.')]
  4.     ver2 = [int(i) for i in v2.split('.')]

  5.     size = max(len(ver1), len(ver2))

  6.     ver1 = ver1 + [0 for _ in range(size-len(ver1))]
  7.     ver2 = ver2 + [0 for _ in range(size-len(ver2))]

  8.     for i in range(size):
  9.         a, b = ver1[i], ver2[i]
  10.         equal = operator.__eq__(a, b)
  11.         greater = operator.__ge__(a, b)
  12.         less = operator.__le__(a, b)
  13.         if equal:
  14.             continue # 这里用要 continue,否则只判断 1 次就退出了
  15.         elif greater:
  16.             return f"{v1}"
  17.         elif less:
  18.             return f"{v2}"
  19.    
  20.     return f"{v1} = {v2}"

  21. v1 = input("请输入第一个版本号: ")
  22. v2 = input("请输入第二个版本号: ")
  23. print(comparison(v1, v2))
复制代码
输出结果:
  1. 请输入第一个版本号: 1.1.1
  2. 请输入第二个版本号: 1.2
  3. 1.2
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-3 10:11:08 | 显示全部楼层
好的,我是傻逼,看来还是需要先把俩列表换算成等长,不然又会出现类似【1.0.1】【1.0.1.0】比较之后【1.0.1.0】大的BUG了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-3 10:12:35 | 显示全部楼层    本楼为最佳答案   
qwe2052190 发表于 2021-10-3 10:01
import operator

def v_split(v1,v2):


你都用这个模块了
直接比较就好了
  1. import operator


  2. def v_split(v1, v2):
  3.     # """比较两个版本号,结果返回最新版本号"""
  4.     # sp_1 = [int(x) for x in v1.split('.')]
  5.     # sp_2 = [int(x) for x in v2.split('.')]

  6.     # len_p = len(sp_1) - len(sp_2)
  7.     # if len_p > 0:
  8.     #     sp_2.extend([0] * len_p)

  9.     # elif len_p < 0:
  10.     #     sp_1.extend([0] * (-len_p))

  11.     # if operator.lt(sp_1, sp_2):
  12.     #     print("v2:", sp_2)

  13.     # elif operator.gt(sp_1, sp_2):
  14.     #     print('v1:', sp_1)

  15.     # else:
  16.     #     print('v1 = v2')
  17. # -------------------------------------------
  18.     if operator.lt(v1, v2):
  19.         print("v2:", v2)
  20.     elif operator. gt(v1, v2):
  21.         print("v1:", v1)
  22.     else:
  23.         print('v1 = v2')


  24. v1 = input("请输入第一个版本号: ")
  25. v2 = input("请输入第二个版本号: ")
  26. v_split(float(v1), float(v2))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-3 10:17:23 | 显示全部楼层
qwe2052190 发表于 2021-10-3 10:06
import operator

def v_split(v1,v2):

直接换成浮点数也行
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-3 10:47:43 | 显示全部楼层
嘿嘿,谢谢哈,我看到你后面还提到可以直接换成浮点数的吗?那如果版本号是1.01.02.1这种情况的话,也可以吗,嘿嘿
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-3 10:52:16 | 显示全部楼层

感谢感谢,辛苦啦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-3 11:06:46 | 显示全部楼层
qwe2052190 发表于 2021-10-3 10:47
嘿嘿,谢谢哈,我看到你后面还提到可以直接换成浮点数的吗?那如果版本号是1.01.02.1这种情况的话,也可以 ...

还有这种版本号的吗
我以为就一个正常的浮点数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-3 15:43:00 | 显示全部楼层
大马强 发表于 2021-10-3 11:06
还有这种版本号的吗
我以为就一个正常的浮点数

哈哈,可能是我想的奇葩了,的确是没遇到过这种类型的版本号
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-25 15:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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