0
votes

Comment obtenir les valeurs d'une liste de dictionnaires et les ajouter

  • J'ai beaucoup de identifiants d'employés - comme indiqué ci-dessous.

  • Je dois obtenir la valeur du nom de l'entreprise et l'ajouter à une liste.

  • J'ai besoin d'obtenir les politiques de valeur et de les ajouter à une liste après avoir vérifié parent .

  • si le parent est Marketing , le nom doit être ajouté au niveau1.

  • si le parent est Publicité , le nom doit être ajouté au niveau2.

  • si une entreprise est [] je dois passer Aucun au lieu de Null List

  • Il faut également vérifier que la clé existe ou non pour certaines clés, il y a un risque de manquer de politiques , business

  • [
      {
        "id": "100",
        "name": "A",
        "Business": ["Enterprise", "Customer"],
        "level1": ['Second division', 'First division'],
        "level2": [ ]
      },
      {
        "id": "101",
        "name": "B",
        "Business": ["Enterprise", "Customer"],
        "level1": ['Second division', 'First division'],
        "level2": [ ]
      }
    ]
    

    Mon code

    product = {}
    product['id'] = {}
    product['name'] = {}
    product['Business'] = {}
    x = [{**d, "Business": [i["name"] for i in d["Business"]]} for d in test]
    product["policies"]["level1"] = []
    product["policies"]["level2"] = []
    for j in test["policies"]:
        if "Marketing" in j["parentName"]:
            d["level1"] += [j["name"]]
        if "Advertising" in j["parent"]:
            d["level2"] += [j["name"]]
    

    Attendez-vous à 2 ID

        test = [{"id":"100","name":"A",
        "Business":[{"id":"7","name":"Enterprise"},
        {"id":"8","name":"Customer"}],
        "policies":[{"id":"332","name":"Second division","parent":"Marketing"},
        {"id":"3323","name":"First division","parent":"Marketing"}]},
        {"id":"101","name":"B",
        "Business":[{"id":"7","name":"Enterprise"},
        {"id":"8","name":"Customer"}],
        "policies":[{"id":"332","name":"Second division","parent":"Marketing"},
        {"id":"3323","name":"First division","parent":"Marketing"}]}]
    

9 commentaires

dict que vous avez publié a des clés en double, pensez à reformater le code.


@Sushanth sa liste de dictionnaire et non de dictionnaire


Il existe deux clés en double nommées "id" et "name" . ( "id": "100", "name": "A" était couvert par "id": "101", "name": "A" ).


@Sushanth modifié en B


@jizhihaoSAMA modifié en B


Votre modification ne le résout pas, vous pouvez utiliser pprint.pprint pour voir clairement votre résultat.


Vous devez insérer }, { avant "id": "101", "name": "B",


@Jasmijn édité merci pour l'œil


@jizhihaoSAMA édité merci


3 Réponses :


1
votes

Mis à jour pour refléter les modifications . Je suppose que les clés manquantes signifient que vous voudriez ignorer ce dictionnaire particulier.

def filter_policies(employee, parent):
    return [policy['name'] for policy in employee['policies'] if policy['parent'] == parent]

def process_employee(employee):
    return {'id': employee['id'], 'name': employee['name'],
        'Business': [business['name'] for business in employee['Business']],
        'level1': filter_policies(employee, 'Marketing'),
        'level2': filter_policies(employee, 'Advertising')}

output = []
for employee in test:
    try:
        item = process_employee(employee)
    except KeyError:
        pass # ignore employees with missing dictionary keys
    else:
        output.append(item)


4 commentaires

que va-t-il faire si un identifiant n'a pas d'activité ou toute autre clé qui recherche son erreur de clé d'erreur de lancement, comment gérer cela


Vous pouvez utiliser try / sauf pour gérer les exceptions. Si certaines clés peuvent manquer, veuillez modifier votre question et spécifier les conditions exactes, de cette façon, nous saurons comment y faire face au mieux.


Votre code échoue, j'ai changé la clé Entreprise en Profession ou toute autre clé. attendue est toujours Business est là avec [].


Si vous modifiez la clé dans votre saisie, vous devez également modifier la clé dans le code.



1
votes

Pour cela, entrée fixe (car dans votre exemple le test dict a des clés dupliquées)

def do_the_thing(lst):
    resp = []

    parents_mapper = {
        'Marketing': 'level1',
        'Advertising': 'level2'
    }

    for el in lst:
        d = {
            'id': el['id'],
            'name': el['name'],
            'Business': [],
            'level1': [],
            'level2': []
        }
        for business in el.get('Business', []):
            business_name = business.get('name')
            if business_name:
                d['Business'].append(business_name)

        for policy in el.get('policies', []):
            policy_parent = policy.get('parent')
            parent_found = parents_mapper.get(policy_parent)
            policy_name = policy.get('name')
            if parent_found and policy_name:
                d[parent_found].append(policy_name)

        resp.append(d)
    return resp


if __name__ == "__main__":
    import pprint
    pp = pprint.PrettyPrinter(4)
    pp.pprint(do_the_thing(test))

Ce code fera ce que vous voulez

XXX


3 commentaires

que va-t-il faire si un identifiant n'a pas d'activité ou toute autre clé qui recherche son erreur de clé d'erreur de lancement, comment gérer cela


J'ai ajusté ma réponse avec .get supplémentaire afin que toutes ces clés puissent être manquantes maintenant.


Comment passer si une entreprise est [] Je dois passer Aucun à la liste



1
votes

Souhaitant gagner le prix du code le plus laid ici aujourd'hui, voici une solution utilisant uniquement des compréhensions:

[{'id': '100',
  'name': 'A',
  'Business': ['Enterprise', 'Customer'],
  'level1': ['Second division', 'First division'],
  'level2': []},
 {'id': '101',
  'name': 'B',
  'Business': ['Enterprise', 'Customer'],
  'level1': ['Second division', 'First division'],
  'level2': []}]

Résultat:

x = [{**d, "Business": [i["name"] for i in d["Business"]],
           "level1": [i["name"] for i in d["policies"] if i["parent"] == "Marketing"],
           "level2": [i["name"] for i in d["policies"] if i["parent"] == "Advertising"],
            } for d in test]

[d.pop("policies") for d in x]
pprint.pprint(x, sort_dicts=False)

p >


2 commentaires

que va-t-il faire si un identifiant n'a pas d'activité ou toute autre clé qui recherche son erreur de clé d'erreur de lancement, comment gérer cela


@aysh Ensuite, je suggérerais de changer le pour x dans d ["stufftocheck"] en pour x dans d.get ("stufftocheck", []) .