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

2024-04-18 17:27:06 发布

您现在位置:Python中文网/ 问答频道 /正文

有人能给我解释一下为什么会出现以下代码:

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.4(1.4、1.4.4等)


Tags: 代码数字tarliansiblemaxpsprint
2条回答

这是另一个好办法

Python有自己的模块pkg\u resources,它有方法解析\u版本

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

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

>>> 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结果,需要传递key函数。你知道吗

例如:

>>> 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'

相关问题 更多 >