Saya mencoba meringkas dan mengelompokkan beberapa kamus ke dalam kamus tunggal dalam array berdasarkan nilai kamus. Juga, dapatkan hitungan nilai pengelompokan.

Misalnya dalam format input mentah 'sms', saya bermaksud mengelompokkan berdasarkan subscribe_name ,endpoint ,errorId dan mendapatkan hitungannya.

Saya tidak tahu harus mulai dari mana dan berharap beberapa panduan dari sini dan sumber perpustakaan dapat digunakan.

Format muatan yang diinginkan:

{
    "myDeviceX": {
        "channel": {
            "sms": [
                {
                    "endpoint": "+123456789",
                    "errorId": ["1","2","3","4"],
                    "error_num": 4,
                    "subscriber_name": "tester1"
                },
                {
                    "endpoint": "+234567890",
                    "errorId": ["1"],
                    "error_num": 1,
                    "subscriber_name": "tester2"
                }
            ],
            "email": [
                {
                    "endpoint": "xxx@gmail.com",
                    "errorId": ["1","2","3"],
                    "error_num": 3,
                    "subscriber_name": "tester1"
                }
            ]
        }
    }
}

Format muatan input mentah:

{
    "myDeviceX": {
        "sms": [
            {
                "endpoint": "+123456789",
                "errorId": "1",
                "subscriber_name": "tester1"
            },
            {
                "endpoint": "+123456789",
                "errorId": "2",
                "subscriber_name": "tester1"
            },
            {
                "endpoint": "+123456789",
                "errorId": "3",
                "subscriber_name": "tester1"
            },
            {
                "endpoint": "+123456789",
                "errorId": "4",
                "subscriber_name": "tester1"
            },
            {
                "endpoint": "+234567890",
                "errorId": "1",
                "subscriber_name": "tester2"
            }
        ],
        "email": [
            {
                "endpoint": "xxx@gmail.com",
                "errorId": "1",
                "subscriber_name": "tester1"
            },
            {
                "endpoint": "xxx@gmail.com",
                "errorId": "2",
                "subscriber_name": "tester1"
            },
            {
                "endpoint": "xxx@gmail.com",
                "errorId": "3",
                "subscriber_name": "tester1"
            }
        ]
    }
}
0
JohnnyCc 14 Agustus 2019, 04:16

1 menjawab

Jawaban Terbaik

Untuk tujuan pendidikan, saya akan menyajikan dua solusi yang berbeda, pertama yang paling mudah dan kemudian pendekatan "pythonic" (yang belum tentu lebih baik sama sekali).

Pertama mari kita input awal kita (diberikan dalam pertanyaan yang disimpan dalam variabel initial_data. Kemudian 1) untuk setiap perangkat, buat objek baru untuk perangkat itu 2) untuk setiap saluran di perangkat itu, buat daftar baru untuk itu saluran, dan 3) kelompokkan semua item di saluran itu berdasarkan titik akhir dan nama pelanggan dan tambahkan objek baru untuk titik akhir itu ke daftar yang kami buat untuk saluran.

import itertools

output = {}

# Look at each device and its channels
for device, channels in initial_data.items():
    output[device] = {'channel': {}}  # create new object for the device

    # For each channel, we can process its items by endpoints and subscribers
    for channel, entries in channels.items():
        output[device]['channel'][channel] = []  # create a new list for each channel

        for k, g in itertools.groupby(entries, key=lambda x: (x['endpoint'], x['subscriber_name'])):  # groups entries by a endpoint-subscriber_name pair
            output[device]['channels'][channel].append({
                'endpoint': k[0],  # the endpoint
                'subscriber_name': k[1],  # the subscriber name
                'error_num': len(list(g)),
                'error_id': [x['errorId'] for x in list(g)]
            })

# Output is now in the desired format!

Dan kita selesai!

Berikut ini adalah pendekatan "pythonic" yang menggunakan, mungkin terlalu banyak, pemahaman dict dan daftar, untuk tujuan demonstratif jika tidak ada yang lain:

output = {
    device: {'channels': {
        channel: [
            {
                'endpoint': k[0],
                'subscriber_name': k[1],
                'error_num': len(list(g)),
                'error_id': [x['errorId'] for x in list(g)]
            }
            for k, g in itertools.groupby(entries, key=lambda x: (x['endpoint'], x['subscriber_name']))
        ]
        for channel, entries in channels.items()
    }}
    for device, channels in initial_data.items()
}

Pendekatan ini pada dasarnya hanya membalik semua loop. Anda mungkin menemukan bahwa semua pemahaman bersarang ini agak berat, tetapi mungkin solusi terbaik terletak di antara keduanya.

2
jeremye 14 Agustus 2019, 03:33