gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 02:25:52 26 4
gpt4 key购买 nike

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

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com