通过子字符串聚合json元素

时间:2018-09-03 13:27:06

标签: python json string dictionary

我具有以下结构:

[
    {
        "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中实现吗?还有更好的主意吗?

2 个答案:

答案 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按字母对版本进行分组,并删除每个组中除最后两个版本以外的所有版本。