代码之家  ›  专栏  ›  技术社区  ›  Omri

按子字符串聚合json元素

  •  2
  • Omri  · 技术社区  · 6 年前

    [
        {
            "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是类型,v1是版本)。

    如何创建所有 哪两个不是最新的版本?

    a-v1
    b-v1
    

    你知道用Python怎么做吗?我一直在考虑数子串。例如:使用 - 作为分隔符,并计算找到字符串左侧(aa、b、c)的次数。这是否可以在Python中实现这样的东西?有更好的主意吗?

    2 回复  |  直到 6 年前
        1
  •  2
  •   jpp    6 年前

    假设你的名单 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']
    
        2
  •  1
  •   Eric Duminil    6 年前

    如果使用稍微不同的数据格式,问题会更容易解决。

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