Удалить весь dict, если соответствует ключ - PullRequest
1 голос
/ 19 июня 2020

Я новичок в python, но все еще пытался найти решение в inte rnet. Но решения не нашел. Вот мои данные, которые я хотел бы обрезать:

{'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'}
}

Я бы хотел обрезать dict с ключом properties.old Вот мой код, который мне не удается отфильтровать:

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

Есть предложения относительно того, что я делаю неправильно?

Ответы [ 4 ]

1 голос
/ 19 июня 2020

Вы можете подумать о создании нового объекта с пониманием списка. Обратите внимание на этот однострочник:

result = { 'Items' : [dic for dic in json_result['Items'] if not 'properties.old' in dic] }
1 голос
/ 19 июня 2020

Это должно сработать для вас (вам просто нужно было перебрать ключи внутренних словарей):

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

Вывод:

{'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'}]}
0 голосов
/ 19 июня 2020

Сначала получите индекс и выполните dry прогон (результаты печати) перед фактическим удалением:

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]

Возврат:

ABC123

Значение словарной статьи где этот диктат теперь удален.

0 голосов
/ 19 июня 2020

Эй, вы ошибаетесь, потому что вы удаляете локальную переменную элемента в l oop, а не элемент списка. Попробуйте выполнить итерацию по индексу и использовать pop или remove.

        > >>> a=list(range(10))
        > >>> for i in a:       
                  del i    
        > >>> a 
          [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
        > >>>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...