我具有以下结构:
[
{
"name": "a-v1",
"date": "2018-05-08T08:40:35.000Z"
},
{
"name": "a-v2",
"date": "2018-05-20T08:40:35.000Z"
},
{
"name": "a-v3",
"date": "2018-05-22T08:40:35.000Z"
},
{
"name": "b-v1",
"date": "2018-02-08T08:40:35.000Z"
},
{
"name": "b-v2",
"date": "2018-05-08T08:40:35.000Z"
},
{
"name": "b-v3",
"date": "2018-05-10T08:40:35.000Z"
},
{
"name": "c-v1",
"date": "2018-10-08T08:40:35.000Z"
},
{
"name": "c-v2",
"date": "2018-11-08T08:40:35.000Z"
},
{
"name": "d-v1",
"date": "2018-08-08T08:40:35.000Z"
}
]
每个name
都来自类型和版本(例如,在a-v1
中,类型中的a和版本1)。
如何创建不是所有2个最新版本的所有name
的列表?
在我们的例子中,输出为:
a-v1
b-v1
有人知道如何在Python中做到这一点吗?我一直在考虑计数子字符串。例如:使用-
作为分隔符,并计算我找到字符串(aa,b,c)左侧的次数。这可能在Python中实现吗?还有更好的主意吗?
答案 0 :(得分:2)
假设您的列表L
已预先排序,如您的示例所示,您可以使用itertools.groupby
并使用列表切片:
from itertools import chain, groupby
from operator import itemgetter
grouper = groupby(map(itemgetter('name'), L), key=lambda x: x.split('-')[0])
groups = (list(vals)[:-2] for _, vals in grouper)
res = list(chain.from_iterable(filter(None, groups)))
# ['a-v1', 'b-v1']
答案 1 :(得分:1)
如果数据格式稍有不同,该问题将更加容易。
您没有编写任何代码,所以我不会给您完整的答案:
data = [{'name': 'a-v1', 'date': '2018-05-08T08:40:35.000Z'}, {'name': 'a-v2', 'date': '2018-05-20T08:40:35.000Z'}, {'name': 'a-v3', 'date': '2018-05-22T08:40:35.000Z'}, {'name': 'b-v1', 'date': '2018-02-08T08:40:35.000Z'}, {'name': 'b-v2', 'date': '2018-05-08T08:40:35.000Z'}, {'name': 'b-v3', 'date': '2018-05-10T08:40:35.000Z'}, {'name': 'c-v1', 'date': '2018-10-08T08:40:35.000Z'}, {'name': 'c-v2', 'date': '2018-11-08T08:40:35.000Z'}, {'name': 'd-v1', 'date': '2018-08-08T08:40:35.000Z'}]
temp = [d['name'].split('-') for d in data]
# [['a', 'v1'], ['a', 'v2'], ['a', 'v3'], ['b', 'v1'], ['b', 'v2'], ['b', 'v3'], ['c', 'v1'], ['c', 'v2'], ['d', 'v1']]
versions = [(letter, int(v[1:])) for letter, v in temp]
sorted(versions)
它输出:
[('a', 1),
('a', 2),
('a', 3),
('b', 1),
('b', 2),
('b', 3),
('c', 1),
('c', 2),
('d', 1)]
您现在可以尝试使用itertools.groupby
按字母对版本进行分组,并删除每个组中除最后两个版本以外的所有版本。