python - 如果一个值相同而另一个值较低,则从列表中删除字典

标签 python

我有一个带有版本号的字典列表

my_list = [{'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'}]

最后,我希望这个列表只包含每个主要版本的最新版本,并删除所有 alpha/beta 版本。

my_list = [{'version': 'v1.2.7', 'major': '1.2'},
           {'version': 'v1.3.7', 'major': '1.3'}]

我的第一个想法是创建一个新列表并遍历我的列表,如果一个专业不在新列表中,它将被添加,如果它在新列表中,它将进行比较和替换。但我认为可能有更 pythonic 的方式来做到这一点。

编辑:还有 alpha 和 beta 版本,我想从列表中完全删除。

最佳答案

itertools.groupby resque 的另一种情况:

from itertools import groupby

my_list = [{'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'}]

my_list_ = list(filter(lambda x: all(beta not in x['version'] for beta in ('a', 'b')), my_list))  # removing beta-versions

version_f = lambda y: [0 if any(beta in x for beta in ('a', 'b')) else int(x) for x in y['version'].replace('v', '').split('.')]
grouper = lambda x: x['major']

d = [max(k, key=version_f) for _, k in groupby(sorted(my_list, key=grouper), key=grouper)]
print(d)  # -> [{'version': 'v1.2.7', 'major': '1.2'}, {'version': 'v1.3.7', 'major': '1.3'}, {'version': 'v1.4.1a1', 'major': '1.4'}]

注意事项:

  • 不要使用名称 list。您正在覆盖 Python 内置。
  • 如果 list-comprehension 对您来说太大了,请使用 good-old for 循环将其分解。这没有犯罪。
  • 正如@Coldspeed 所提到的,比较版本并不是那么简单,因此为了展示这一点,我冒昧地稍微修改了您的输入(添加了 {'version': 'v1.3.12', 'major': '1.3'}) 并使 lambda 更聪明一些1

1.这基于整数 列表 的 Python 内置排序方案 ([1, 3, 10] > [1, 3 , 7] 返回 True).

关于python - 如果一个值相同而另一个值较低,则从列表中删除字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47469743/

相关文章:

python - Pandas:从受限列范围内的每一行获取随机子集的有效方法

python - 有没有更好的方法用 kwargs 更新对象的 __dict__ ?

Python:在文本文件中搜索字符串后查找值

python - scrapy 抓取一组可能包含下一页的链接

python - 如何从 Route() 装饰器导入变量以形成 Flask 中的文件?

python - 递归减少元组列表

python - 复杂的 pandas 子设置;选择与多列中的条件匹配的行

python - 如何使用 groupby 推断缺失值 - Python?

python - 使用 Python 执行 vBulletin-Forum 登录

python - 用字典中的新值替换键值对中的空白值(python 3.x)