python max函数,混合字符串和数字

时间:2014-02-04 06:39:22

标签: python max

有人可以向我解释为什么以下代码:

li = [u'ansible-1.1.tar.gz', u'ansible-1.2.1.tar.gz', u'ansible-1.2.2.tar.gz', u'ansible-1.2.3.tar.gz',
      u'ansible-1.2.tar.gz', u'ansible-1.3.0.tar.gz', u'ansible-1.3.1.tar.gz', u'ansible-1.3.2.tar.gz',
      u'ansible-1.3.3.tar.gz', u'ansible-1.3.4.tar.gz', u'ansible-1.4.1.tar.gz', u'ansible-1.4.2.tar.gz',
      u'ansible-1.4.3.tar.gz', u'ansible-1.4.4.tar.gz', u'ansible-1.4.tar.gz']

print(max(li))

返回:

ansible-1.4.tar.gz

谢谢

PS:当只有数字(1.4,1.4.4等)时,它返回1.4.4

2 个答案:

答案 0 :(得分:2)

因为它们按字典顺序进行比较:

>>> ord('t'), ord('4')
(116, 52)

>>> 't' > '4'
True

>>> 'ansible-1.4.tar.gz' > 'ansible-1.4.4.tar.gz'
True

要获得ansible-1.4.4.tar.gz作为结果,您需要传递密钥功能。

例如:

>>> li = [u'ansible-1.1.tar.gz', u'ansible-1.2.1.tar.gz', u'ansible-1.2.2.tar.gz', u'ansible-1.2.3.tar.gz',
...       u'ansible-1.2.tar.gz', u'ansible-1.3.0.tar.gz', u'ansible-1.3.1.tar.gz', u'ansible-1.3.2.tar.gz',
...       u'ansible-1.3.3.tar.gz', u'ansible-1.3.4.tar.gz', u'ansible-1.4.1.tar.gz', u'ansible-1.4.2.tar.gz',
...       u'ansible-1.4.3.tar.gz', u'ansible-1.4.4.tar.gz', u'ansible-1.4.tar.gz']
>>>
>>> import re
>>> def get_version(fn):
...     return list(map(int, re.findall(r'\d+', fn)))
...
>>> get_version(u'ansible-1.4.4.tar.gz')
[1, 4, 4]
>>> max(li, key=get_version)
'ansible-1.4.4.tar.gz'

答案 1 :(得分:0)

这是另一个好的解决方案,

Python有自己的模块,名为 pkg_resources ,其方法为 parse_version

>>> from pkg_resources import parse_version
>>> max(li, key=parse_version)
u'ansible-1.4.4.tar.gz'
>>>