Python glom со списком записей группирует общие уникальные идентификаторы client_ids вместе как ключ

Я только что обнаружил glom, и руководство имеет смысл, но я не могу понять, какую спецификацию использовать для записей Chrome BrowserHistory.json для создания структуры данных, сгруппированных по client_id, или даже если это правильное использование glom. Я думаю, что могу добиться этого, используя другие методы, перебирая json в цикле, но я надеялся узнать больше о glom и его возможностях.

В json есть Browser_History со списком для каждой записи истории следующим образом:

{
    "Browser_History": [
        {
            "favicon_url": "https://www.google.com/favicon.ico",
            "page_transition": "LINK",
            "title": "Google Takeout",
            "url": "https://takeout.google.com",
            "client_id": "abcd1234",
            "time_usec": 1424794867875291
},
...

Мне нужна структура данных, в которой все сгруппировано по client_id, например, с client_id в качестве ключа к списку dicts, например:

{ 'client_ids' : {
                'abcd1234' : [ {
                                 "title" : "Google Takeout",
                                 "url"   : "https://takeout.google.com",
                                 ...
                             },
                             ...
                             ],
                'wxyz9876' : [ {
                                 "title" : "Google",
                                 "url"   : "https://www.google.com",
                                 ...
                             },
                             ...
              }
}

Подходит ли для этого glom? Я играл с ним и читал, но, похоже, я не могу правильно понять спецификацию, чтобы выполнить то, что мне нужно. Лучшее, что у меня есть без ошибок:

with open(history_json) as f:
    history_list = json.load(f)['Browser_History']

spec = {
    'client_ids' : ['client_id']
}
pprint(glom(data, spec))

который дает мне список всех client_ids, но я не могу понять, как сгруппировать их вместе как ключи, а не иметь их как большой список. любая помощь будет оценена, спасибо!

1 ответ

Это должно сработать, хотя я не уверен, что это самый «глоумный» способ добиться этого.

      import glom

grouping_key = "client_ids"

def group_combine (existing,incoming):
    # existing is a dictionary used for accumulating the data
    # incoming is each item in the list (your input)
    if incoming[grouping_key] not in existing:
        existing[incoming[grouping_key]] = []
    if grouping_key in incoming:
        existing[incoming[grouping_key]].append(incoming)
    
    return existing


data ={ 'Browser_History': [{}] } # your data structure

fold_spec = glom.Fold(glom.T,init = dict, op = group_combine )
results = glom.glom(data["Browser_History"] ,{ grouping_key:fold_spec })

Другие вопросы по тегам