Je veux convertir une liste en liste régulière en utilisant Python. Comment je fais ça?

Avant la conversion:

        [
            {
                "id": 10005,
                "pinyin": "Lianyiqun",
                "status": "created"
            },
            {
                "id": 10006,
                "pinyin": "Xizhuang",
                "status": "created"
            },
            {
                "id": 10009,
                "pinyin": "Banshenqun",
                "status": "created"
            },
            {
                "id": 10010,
                "pinyin": "Beixindiaodai",
                "status": "created"
            },
            {
                "id": 10032,

                "pinyin": "Banshenqun",
                "status": "created"
            }
        ]

Maintenant, je veux qu'il ait comme ça (la clé est la première lettre majuscule de pinyin, ordre de liste par clé):

[
    {
        "key":"B",
        "data":[
            {
                "id": 10009,
                "pinyin": "Banshenqun",
                "status": "created"
            },
            {
                "id": 10010,
                "pinyin": "Beixindiaodai",
                "status": "created"
            },
            {
                "id": 10032,

                "pinyin": "Banshenqun",
                "status": "created"
            }
        ]
    },
    {
        "key":"L",
        "data":[
            {
                "id": 10005,
                "pinyin": "Lianyiqun",
                "status": "created"
            }
        ]
    },
    {
        "key":"X",
        "data":[
            {
                "id": 10006,
                "pinyin": "Xizhuang",
                "status": "created"
            }
        ]
    }
]

J'ai vu d'autres discussions ici avec une carte utilisée pour de telles choses, mais je ne la comprends pas complètement. Quelqu'un peut-il donner un aperçu de la manière «correcte» de faire Python?

-2
wei shao 16 mars 2019 à 14:51

2 réponses

Meilleure réponse

Vous pouvez le faire sans aucun module Python:

inList =  [
            {
                "id": 10005,
                "pinyin": "Lianyiqun",
                "status": "created"
            },
            {
                "id": 10006,
                "pinyin": "Xizhuang",
                "status": "created"
            },
            {
                "id": 10009,
                "pinyin": "Banshenqun",
                "status": "created"
            },
            {
                "id": 10010,
                "pinyin": "Beixindiaodai",
                "status": "created"
            },
            {
                "id": 10032,

                "pinyin": "Banshenqun",
                "status": "created"
            }
        ]

outList = [{'key': elem, 'data': [item for item in inList if item['pinyin'][0]==elem]} for elem in set(el['pinyin'][0] for el in inList)]
for elem in outList:
    print(elem)

Production:

{'key': 'B', 'data': [{'id': 10009, 'pinyin': 'Banshenqun', 'status': 'created'}, {'id': 10010, 'pinyin': 'Beixindiaodai', 'status': 'created'}, {'id': 10032, 'pinyin': 'Banshenqun', 'status': 'created'}]}
{'key': 'L', 'data': [{'id': 10005, 'pinyin': 'Lianyiqun', 'status': 'created'}]}
{'key': 'X', 'data': [{'id': 10006, 'pinyin': 'Xizhuang', 'status': 'created'}]}
0
Vasilis G. 16 mars 2019 à 22:47

Vous pouvez utiliser itertools.groupby:

grouped = [{'key': key, 'data': sorted(grouped, key=lambda dct: dct['id'])} for key, grouped in itertools.groupby(data, lambda dct: dct['pinyin'][0])]

Donc grouped ressemble à ceci:

 [{'data': [{'id': 10005, 'pinyin': 'Lianyiqun', 'status': 'created'}],
  'key': 'L'},
 {'data': [{'id': 10006, 'pinyin': 'Xizhuang', 'status': 'created'}],
  'key': 'X'},
 {'data': [{'id': 10009, 'pinyin': 'Banshenqun', 'status': 'created'},
           {'id': 10010, 'pinyin': 'Beixindiaodai', 'status': 'created'},
           {'id': 10032, 'pinyin': 'Banshenqun', 'status': 'created'}],
  'key': 'B'}]
0
ForceBru 16 mars 2019 à 11:59