Агрегация элементов json по подстроке - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть следующая структура:

[
    {
        "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 - версия).

Как я могу создать список всех name, которые не являются 2 последними версиями? В нашем случае вывод будет:

a-v1
b-v1

Есть идеи, как это сделать в Python? Я думал о подсчете подстрок. Например: чтобы использовать - в качестве разделителя, и посчитайте, сколько раз я нахожу левую часть строки (aa, b, c). Возможно ли реализовать такую ​​вещь, как вещь в Python? Есть идеи получше?

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Предполагая, что ваш список 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']
0 голосов
/ 03 сентября 2018

Проблема была бы проще с немного другим форматом данных.

Вы не написали никакого кода, поэтому я не дам вам полный ответ:

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, чтобы сгруппировать версии по буквам и удалить каждую версию, кроме двух последних, для каждой группы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...