1
votes

Supprimer un dict entier s'il correspond à une clé

Je suis nouveau sur python mais j'ai toujours essayé de rechercher une solution sur Internet. Mais n'a pas pu trouver de solution. Voici mes données que je voudrais couper:

for item in json_result['Items']:
    if 'properties.old' in item:
        del item

Je voudrais couper un dict ayant une clé properties.old Voici mon code que je ne parviens pas à filtrer:

{'Items': [
        {'event': 'active', 'options.target': 'items', 'meta.timestamp': 1584826254819, 'id': 'foo111', 'userId': '1a938ea1-c65e-641a-5db5-5e56c7d8e90b', 'properties.new': 'ABC123'
        },
        {'event': 'active', 'options.target': 'previousTop', 'meta.timestamp': 1584820823598, 'id': 'foo111', 'userId': '1a938ea1-c65e-641a-5db5-5e56c7d8e90b', 'properties.new': 'KUCC00302'
        },
        {'_.from': 'engineEnd', '_.called': 'track', 'event': 'active', 'traits.id': 'foo333', 'options.target': 'items', 'properties.old': 'ABC123', 'meta.timestamp': 1584826518511, 'partner_resid': 'r-1a938ea1-c65e-641a-5db5-5e56c7d8e90b', 'id': 'foo111', 'userId': '1a938ea1-c65e-641a-5db5-5e56c7d8e90b', 'properties.new': 'ABC111', 'id': 'dc3775e0-6bbb-11ea-a789-4f693944a864', 'anonymousId': '3bd5eda3-8625-4b54-b02b-e24f78011ca7', '_.originalAction': 'track', 'type': 'track'}
}

Des suggestions sur ce que je fais mal?


0 commentaires

4 Réponses :


0
votes

Hé, vous échouez car vous supprimez la variable d'élément local de la boucle et non l'élément de liste. Essayez de parcourir l'index et d'utiliser pop ou remove.

        > >>> a=list(range(10))
        > >>> for i in a:       
                  del i    
        > >>> a 
          [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
        > >>>


0 commentaires

1
votes

Vous pourriez envisager de créer un nouvel objet avec une compréhension de liste. Découvrez ce one-liner:

result = { 'Items' : [dic for dic in json_result['Items'] if not 'properties.old' in dic] }


4 commentaires

Cela a fonctionné comme un champion ... !!!!! Vous êtes un expert en Python. Merci.


Existe-t-il un moyen de trier ces dictionnaires avec meta.timestamp?


Oui, vous pouvez utiliser la commande triée et indiquer le tri par fonction lambda, par exemple: {'Items': sorted ([dic for dic in json_result ['Items'] sinon 'properties.old' in dic], key = lambda x: x ['meta.timestamp'], reverse = False)} Si vous souhaitez inverser l'ordre, changez reverse = True.


Super merci



1
votes

Cela devrait fonctionner pour vous (il vous suffit de parcourir les clés des dictionnaires internes):

{'Items': [{'event': 'active', 'options.target': 'items', 'meta.timestamp': 1584826254819, 'id': 'foo111', 'userId': '1a938ea1-c65e-641a-5db5-5e56c7d8e90b', 'properties.new': 'ABC123'}, {'event': 'active', 'options.target': 'previousTop', 'meta.timestamp': 1584820823598, 'id': 'foo111', 'userId': '1a938ea1-c65e-641a-5db5-5e56c7d8e90b', 'properties.new': 'KUCC00302'}]}

Sorties:

for idx, elem in enumerate(json_results['Items']):
    if 'properties.old' in elem.keys():
        del json_results['Items'][idx]
print(json_results)

p>


3 commentaires

Merci pour votre suggestion rapide. J'ai essayé cette logique mais elle ne supprime pas le dict interne qui a une clé properties.old


@SamudralaPrasad vous aviez tout à fait raison, j'ai eu une erreur dans la suppression des éléments de la liste, maintenant cela devrait fonctionner, vous pouvez l'essayer.


Ouais, même cette logique fonctionnait comme un champion. Merci pour votre aide. :)



0
votes

Commencez par obtenir l'index et effectuez un essai (résultats d'impression) avant la suppression réelle:

ABC123

Retour:

from pprint import pprint as pp

json_result = {'Items': [{'event': 'active',
                          'options.target': 'items',
                          'meta.timestamp': 1584826254819,
                          'id': 'foo111',
                          'userId': '1a938ea1-c65e-641a-5db5-5e56c7d8e90b',
                          'properties.new': 'ABC123'
                         },
                         {'event': 'active',
                          'options.target': 'previousTop',
                          'meta.timestamp': 1584820823598,
                          'id': 'foo111',
                          'userId': '1a938ea1-c65e-641a-5db5-5e56c7d8e90b',
                          'properties.new': 'KUCC00302'
                         },
                         {'_.from': 'engineEnd',
                          '_.called': 'track',
                          'event': 'active',
                          'traits.id': 'foo333',
                          'options.target': 'items',
                          'properties.old': 'ABC123',
                          'meta.timestamp': 1584826518511,
                          'partner_resid': 'r-1a938ea1-c65e-641a-5db5-5e56c7d8e90b',
                          'id': 'foo111',
                          'userId': '1a938ea1-c65e-641a-5db5-5e56c7d8e90b',
                          'properties.new': 'ABC111',
                          'id': 'dc3775e0-6bbb-11ea-a789-4f693944a864',
                          'anonymousId': '3bd5eda3-8625-4b54-b02b-e24f78011ca7',
                          '_.originalAction': 'track',
                          'type': 'track'
                         }
                        ]
               }

for item in json_result['Items']:
    if 'properties.old' in item:
        # pp(item)
        index = json_result['Items'].index(item)
        remove_item = json_result['Items'][index]
        # pp(remove_item)
        print(json_result['Items'][index]['properties.old'])
        del json_result['Items'][index]

La valeur de l'entrée du dictionnaire dans laquelle ce dict a été supprimé.


0 commentaires