понимание списка для фильтрации вложенных данных списка python (запрос API json или преобразованный список python)

#python #json

#python #json

Вопрос:

Привет!

Вопрос: Мне интересно, как использовать понимание списка для фильтрации определенных результатов на основе слова в списке python или каким-либо другим способом извлекать из списка только те строки, которые мне нужны, которые содержат определенное «ключевое слово».

Обзор: Я использую python для отправки запроса к api и получил запрос json. Я преобразовал json с помощью json.loads() и теперь у меня есть вложенный список python, с которым я пытаюсь работать:

 {"results": [
        {
            **"id": 12345678,**
            "applicant": {
                "id": 11342542,
                "first_name": "Mary",
                "last_name": "Johnson",
                "email": "mjohnson@example.org"
            },
            "average_score": 42.0,
            "collaborators": [],
            "created_at": "2020-06-02T*****",
            "current_stage": {
                "id": 5057743,
                "title": "Reviewing"
            },
            "custom_fields": [],
            "decision": null,
            **"labels": [
{
                    "id": 1124354,
                    "name": "Jerusalem"
                },
                {
                    "id": 132456,
                    "name": "Testing Stuff"
                }],**
            "notes": [
                {
                    "id": 536590,
                    "author": {
                        "id": 3342356287,
                        "first_name": "Brett",
                        "last_name": "Wallace",
                        "email": "bwallace@example.com"
                    },
                    "author_role": 2,
                    "content": "This is a sly one.",
                    "edited": false,
                    "created_at": "2020-06-03T15:28:19",
                    "is_private": false,
                    "updated_at": "2020-06-03T15:28:19"
                }
            ],
            "organization": null,
            "overall_score": 45.0,
            "program": {
                "id": 23476343,
                "name": "Test 2"
            },
        },
        {
            **"id": 112334435,**
            "applicant": {
                "id": 113560732,
                "first_name": "Steve",
                "last_name": "Henderson",
                "email": "shenderson@example.com"
            },
            "average_score": 61.0,
            "collaborators": [],
            "created_at": "2020-06-02T19:44:44",
            "current_stage": {
                "id": 549284389,
                "title": "Registration"
            },
            "custom_fields": [],
            "decision": null,
            **"labels": [
                {
                    "id": 23423,
                    "name": "Nazareth"
                },
                {
                    "id": 239843,
                    "name": "Age Requirements"
                }
            ],**
            "notes": [],
            "organization": null,
            "overall_score": 61.0,
            "program": {
                "id": 223432,
                "name": "Test 2"
            },
            "reference_id": "SPR21-2260071923",
            "state": 0,
            "status": {
                "id": 20943893,
                "name": "Accepted"
            },
            "title": "SPR21-2260071923",
            "updated_at": "2020-09-14T02:16:51",
            "weighted_score": 61.0,
            "last_submitted_at": "2020-06-03T16:44:26"
        },
}
  

Я могу извлечь только те поля, которые мне нужны, используя следующий код:

 for application in r['results']:    
    print(application['id'],application['labels'])
  

Я получаю что-то похожее на это:

 18318202 [{'id': 109135, 'name': 'Jerusalem'}, {'id': 109198, 'name': 'Testing Stuff'}]   
11233443 [{'id': 109135, 'name': 'Nazareth'}, {'id': 109198, 'name': 'Age Requirement'}]
  

Есть ли способ для меня возвращать значения только с «Иерусалимом» в поле [‘labels’]? Другими словами, если посмотреть на приведенный выше пример, он вернет только первую строку, поскольку вторая строка не содержит слова Jerusalem. Я согласен либо фильтровать эту информацию из данных (оператор условной печати), либо извлекать ее в новый список, но я не могу понять, как получить только те значения, которые содержат в них «Иерусалим». Все ресурсы, которые я нашел, рассказывают о том, как загружать и преобразовывать данные, но не отфильтровывать их после факта..Заранее спасибо за чье-либо время и поддержку!!

Ответ №1:

 filtered_data = [(application['id'], application['labels']) for application in  
                 r['results'] if 'Jerusalem' in
                 (item['name'] for item in application['labels'])]
  

вероятно, это тоже сработает

 filtered_data = [(application['id'], application['labels']) for application in  
                 r['results'] if application['labels'][0]['name'] == 'Jerusalem']
  

Комментарии:

1. Я не знаю, кто вы, я не знаю, чего вы хотите… Если вы ищете деньги, я могу сказать вам, что у меня нет денег, но то, что у меня есть, — это ПОХВАЛА и лучший ответ. Большое ВАМ спасибо, если бы я мог только выразить словами, как сильно вы мне помогли, это было бы больше похоже на картинку, чем на слова!! Ты потрясающий. Это сработало!! Я пробовал что-то подобное, но не включал элемент [‘name’] . Еще раз спасибо!!

2. ТАК что дело не в деньгах, а в сообществе. Мы делимся знаниями и помогаем коллегам-программистам