您的想法
您的想法实际上是一个不错的想法。它高效,可以相对Pythonic地实现:
import re
releases = [{'version': 'v1.2.3', 'major': '1.2'},
{'version': 'v1.2.7', 'major': '1.2'},
{'version': 'v1.3.7', 'major': '1.3'},
{'version': 'v1.4.1a1', 'major': '1.4'},
{'version': 'v1.3.8b1', 'major': '1.3'},
{'version': 'v1.3.2', 'major': '1.3'}]
stable_releases = [r for r in releases if 'a' not in r['version']
and 'b' not in r['version']]
latest = {}
def major_minor_build(version):
return [int(d) for d in re.findall('\d+', version)]
for release in stable_releases:
version, major = release['version'], release['major']
latest[major] = max([version, latest.get(major, '')],
key=major_minor_build)
print(latest)
输出的数据是一组
(major, latest)
的字典对,相比于一组字典列表来说更易于处理。
SetuptoolsVersion
版本可能会很棘手。我们不需要重复造轮子,可以使用 pkg_resources.SetuptoolsVersion
。比较已经实现了,所以 max
和 sort
不需要任何关键字。作为奖励,如果版本是 alpha 或 beta,is_prerelease
将为 True:
from pkg_resources import SetuptoolsVersion, parse_version
from itertools import groupby
def get_major(release):
return release._version.release[:2]
mylist = [{'version': 'v1.2.3', 'major': '1.2'},
{'version': 'v1.2.7', 'major': '1.2'},
{'version': 'v1.3.7', 'major': '1.3'},
{'version': 'v1.4.1a1', 'major': '1.4'},
{'version': 'v1.3.8b1', 'major': '1.3'},
{'version': 'v1.3.2', 'major': '1.3'}]
releases = [parse_version(r['version']) for r in mylist]
stable_releases = [r for r in releases if not r.is_prerelease]
stable_releases.sort()
print({major:max(group) for major, group in groupby(stable_releases, key=get_major)})