python 的sort

yunfeifan 2009-09-14 04:55:17
加精
有这么一个版本号的list
version = ['1.0.1', '1.0.2', '1.0.21', '1.2.9', '1.2.11']
我怎么样能对版本号的大小进行排序,获得最大的版本号(1.2.11)
max 或者sort都是对字符串进行排序,不是我要的结果
...全文
1660 51 打赏 收藏 转发到动态 举报
写回复
用AI写文章
51 条回复
切换为时间正序
请发表友善的回复…
发表回复
amu9900 2010-07-09
  • 打赏
  • 举报
回复
要不直接用sort吧,其实也是可以做到的,原理是一样的:

#这样方便一点也好理解一点
version = ['1.0.1', '1.0.2', '1.0.21', '1.2.9', '1.2.11']
version.sort(key=lambda x:tuple(int(v) for v in x.split(".")))


#打印version
>>> version
['1.0.1', '1.0.2', '1.0.21', '1.2.9', '1.2.11']
amu9900 2010-07-09
  • 打赏
  • 举报
回复
[Quote=引用楼主 yunfeifan 的回复:]
有这么一个版本号的list
version = ['1.0.1', '1.0.2', '1.0.21', '1.2.9', '1.2.11']
我怎么样能对版本号的大小进行排序,获得最大的版本号(1.2.11)
max 或者sort都是对字符串进行排序,不是我要的结果
[/Quote]

转换成tuple先,再对其排序
比如:

>>> a = [(1,2,3),(9,2,3),(10,3,21),(10,4,1)]
>>> max(a)
(10, 4, 1)
>>> a = [(1,2,3),(9,2,3),(10,3,21),(10,4,1),(10,5)]
>>> max(a)
(10, 5)


所以你的问题就很容易解决了:

version = ['1.0.1', '1.0.2', '1.0.21', '1.2.9', '1.2.11']
max([tuple(int(v) for v in vs.split(".")) for vs in version ])


当然,返回的是一个tuple,用".".join一下,不喜欢写成一行那就拆开写吧。

LB3690 2010-03-18
  • 打赏
  • 举报
回复
你先把version = ['1.0.1', '1.0.2', '1.0.21', '1.2.9', '1.2.11'] 作个脚本改成version2 = [101, 102, 1021, 129, 1211]再作什么排行比大小不是很简单
takemeaway002 2010-03-16
  • 打赏
  • 举报
回复
看不太懂
jason_azhe 2010-03-12
  • 打赏
  • 举报
回复
def cmp2(x, y):
a = x.split(".", 1)
b = y.split(".", 1)

c = cmp(int(a[0]), int(b[0]))
if c != 0 :
return c
else :
if len(a) > 1 and len(b) > 1 :
return cmp2(a[1], b[1])
else :
return 0
jason_azhe 2010-03-12
  • 打赏
  • 举报
回复
sorry,不知道怎么插入代码。

def cmp2(x, y):
a = x.split(".", 1)
b = y.split(".", 1)

c = cmp(int(a[0]), int(b[0]))
if c != 0 :
return c
else :
print("a1", a[1], "b1", b[1])
if a[1] and b[1] :
return cmp2(a[1], b[1])
else :
return 0
jason_azhe 2010-03-12
  • 打赏
  • 举报
回复
用递归啊,多长都没关系
def cmp2(x, y):
a = x.split(".", 1)
b = y.split(".", 1)

c = cmp(int(a[0]), int(b[0]))
if c != 0 :
return c
else :
print("a1", a[1], "b1", b[1])
if a[1] and b[1] :
return cmp2(a[1], b[1])
else :
return 0
runnersun 2009-09-22
  • 打赏
  • 举报
回复
关注,用python做算法运算是不是有些容易些,可以将C算法集拿来转换一下
xiaoyaoty 2009-09-20
  • 打赏
  • 举报
回复
不容易
beefliu 2009-09-20
  • 打赏
  • 举报
回复
纯支持
  • 打赏
  • 举报
回复
5楼的方法正解
jokerdx 2009-09-19
  • 打赏
  • 举报
回复
学习了~~~~~~~~~~~~~
cnliming 2009-09-19
  • 打赏
  • 举报
回复
便利下啊
minbing 2009-09-19
  • 打赏
  • 举报
回复
写完了才发现有仁兄已经完成了,但还是贴出来,重复也罢,大家一起交流python:

def cmp2(str1, str2):
s1 = str1.split('.')
s2 = str2.split('.')
c1 = cmp(int(s1[0]), int(s2[0]))
if c1 != 0:
return c1
else:
c2 = cmp(int(s1[1]), int(s2[1]))
if c2 != 0:
return c2
else:
c3 = cmp(int(s1[2]), int(s2[2]))
return c3

v = ['1.0.1', '1.0.2', '1.0.21', '1.2.9', '1.2.11']

v.sort(lambda x, y: cmp2(y, x))
print v
_为了部落 2009-09-18
  • 打赏
  • 举报
回复
结构体
dehexiao 2009-09-18
  • 打赏
  • 举报
回复
mark
hufeieagle 2009-09-18
  • 打赏
  • 举报
回复
5楼的
ningtf 2009-09-18
  • 打赏
  • 举报
回复
都有一定道理,多试试嘛
cjj2003 2009-09-18
  • 打赏
  • 举报
回复
mark
sun13815300 2009-09-18
  • 打赏
  • 举报
回复
帅哥给我分!帅哥给我分!帅哥给我分!
加载更多回复(29)

37,719

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧