KAsia
KAsia

Reputation: 3

Python - grouping values in dictionary

Here is JSON which I'm receiving from Smartsheet API:

{"rows":
    [
        {
            "id":1315072712697732,
            "cells":
            [
                {"columnId":3691535201003396,"value":"MyBooks","displayValue":"MyBooks"},
                {"columnId":8195134828373892},
                {"columnId":876785433896836,"value":"2018 Year","displayValue":"2018 Year"},
                {"columnId":5380385061267332,"value":"http://google.com","displayValue":"http://google.com"}
            ]
        },

        {
            "id":5818672340068228,
            "cells":
            [
                {"columnId":3691535201003396,"value":"MyBooks","displayValue":"MyBooks"},
                {"columnId":8195134828373892},
                {"columnId":876785433896836,"value":"2019 Year","displayValue":"2019 Year"},
                {"columnId":5380385061267332,"value":"http://google.com","displayValue":"http://google.com"}
            ]
        },

        {   
            "id":6381622293489540,
            "cells":
            [
                {"columnId":3691535201003396,"value":"MyMovies","displayValue":"MyMovies"},
                {"columnId":8195134828373892},
                {"columnId":876785433896836,"value":"2027 Year","displayValue":"2027 Year"},
                {"columnId":5380385061267332,"value":"http://google.com","displayValue":"http://google.com"}
            ]
        },
        {
            "id":6100147316778884,
            "cells":
            [
                {"columnId":3691535201003396,"value":"MyMovies","displayValue":"MyMovies"},
                {"columnId":8195134828373892},
                {"columnId":876785433896836,"value":"2035 Year","displayValue":"2035 Year"},
                {"columnId":5380385061267332,"value":"http://google.com","displayValue":"http://google.com"}
            ]
        },
        {
            "id":8351947130464132,
            "cells":
            [
                {"columnId":3691535201003396,"value":"MyHobbies","displayValue":"MyHobbies"},
                {"columnId":8195134828373892},
                {"columnId":876785433896836,"value":"2037 Year","displayValue":"2037 Year"},
                {"columnId":5380385061267332,"value":"http://google.com","displayValue":"http://google.com"}
            ]
        }]}

Here is a piece of my python's code:

s = json.loads(myJson)
my_dictionary = []
for element in s['rows']:
        my_dictionary.append({'category': element['cells'][0]['displayValue'],
                                        'categoryId': element['cells'][1]['columnId'],
                                        'pages': [
                                            {'pageName': element['cells'][2]['displayValue'],
                                             'pageURL': element['cells'][3]['displayValue']
                                             }
                                        ]})

As I result I got dictionary with all data I need (without all unnecessary stuff), except one thing. I want to group it by category values. So output I want to achieve should looks similar to this:

    "category": "MyMovies",
    "categoryID": "8195134828373892"
    "pages": 
        [
            {"pageName": "2018 Year", "pageURL": "https://google.com"},
            {"pageName": "2019 Year", "pageURL": "https://google.com"}
        ]

How can I do this?

Upvotes: 0

Views: 72

Answers (1)

ingvar
ingvar

Reputation: 4377

You can do it with following code:

from collections import defaultdict

d = defaultdict(list)
for element in my_dictionary:
    d[(element['categoryId'], element['category'])] += element['pages']  # merges all pages into one list
result = []
for element in sorted(d, key=lambda k: k[1]):  # sort by category name
    result.append({
        'category': element[1],
        'categoryId': element[0],
        'pages': sorted(d[element], key=lambda e: e['pageName'])  # sort by page name in pages list
        })
print(result)

Upvotes: 1

Related Questions