Несколько элементов из json

#python #scrapy

#python #scrapy

Вопрос:

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

 {"list_of_something":[
       {"first_name": "name",
        "property_one": "property",
        "property_two": "property"
       },
       {"first_name": "name",
        "property_one": "property",
        "property_two": "property"
       },
 ....
 

Я хочу поместить это в один пункт. Я попробовал это

         if json_data.get('list_of_something'):
        for item in json_data['list_of_something']:
            resource = {"first_name": item.get('first_name'),
                            "property_one": item.get('property_one'),
                           }
 

но он собирает только последнюю запись.
Я хочу собрать его как один элемент «ресурс», который содержит все элементы из «list_of_something».
Как я могу это сделать?
UPD.
Мне нужно всего несколько полей, а не каждое поле из list_of_something

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

1. Очевидно, что только одна вещь может быть присвоена свойству словаря, такому как «property_one». Ваша цель — сделать ключи уникальными или преобразовать «property_one» в массив, содержащий все значения из элементов в «list_of_something»?

2. Пожалуйста, предоставьте пример ввода и ожидаемый результат.

3. я хочу создать «ресурс», содержащий список dicts

4. вывод: ‘resource’: [{‘name’: ‘name1’, ‘property_one’: ‘123123123’, ‘property_two’: ‘74955877788’}, {‘name’: ‘name2’, ‘property_one’: ‘333333333’, ‘property_two’: ‘44444444’}, ]

5. list_of_something уже является списком dict, и если требуется генерировать «ресурс», который также является списком dict, идентичным list_of_something, то зачем использовать эти циклы for . Вы можете просто присвоить list_of_something «ресурсу».

Ответ №1:

 if json_data.get('list_of_something'):
    resource = []
    for item in json_data['list_of_something']:
        resource.append({"first_name": item.get('first_name'),
                        "property_one": item.get('property_one'),
                        "property_two": item.get('property_two')})
 

Является resource ли список в таком формате тем, что вы ищете?

Вы могли бы просто сделать это:

resource = json_data['list_of_something']

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

1. @SorryCigane Разве list_of_something уже не является списком dicts?

2. @saquintes Это в примере ввода, поэтому не должно быть причин перебирать его элементы, если я правильно понимаю вопрос.

3. @saquintes да! я забыл сказать, что мне нужны специальные списки из list_of_something, а не каждый

4. Вы можете сделать это в одной строке, используя понимание списка.

5. @SorryCigane [{"first_name": item.get('first_name'), "property_one: item.get('property_one'), "property_two": item.get('property_two')} for item in json_data['list_of_something']]

Ответ №2:

То, что вам нужно, — это уже список элементов в результате вашей операции json.loads(). Ваше сообщение может означать, что вы, возможно, захотите переименовать ключи. Вы ввели первый ключ «second_name» во второй записи после того, как первый был «first_name». В любом случае, вы можете сделать что-то вроде:

 resource = json_data.get('list_of_something')
if resource:
    <rename the keys in a for loop if that is what you wanted>
    <do the thing to the stuff to achieve the outcome>
else:
    <handle 'list_of_something' not being in the json>
 

Ответ №3:

В соответствии с вашим требованием я вижу, что вы хотите, чтобы определенные ключи из dict элемента в json_data list присутствовали внутри элемента dict для resource списка.

Подумайте о том, чтобы сохранить необходимые ключи в списке, а затем выполнить итерацию по нему. Обратитесь к фрагменту ниже

 json_data = {"list_of_something":[
       {"first_name": "name",
        "property_one": "property",
        "property_two": "property"
       },
       {"first_name": "name",
        "property_one": "property",
        "property_two": "property"
       }
    ]
}

resource = []
list_of_keys_required = ["first_name", "property_one"]
if json_data.get('list_of_something'):
    for item in json_data['list_of_something']:
        new_dict = {}
        for key,value in item.items():
            if key in list_of_keys_required:
                new_dict[key] = value
        resource.append(new_dict)


print(resource)

 

Приведенное выше даст вам результат в виде

 [{'first_name': 'name', 'property_one': 'property'}, {'first_name': 'name', 'property_one': 'property'}]
 

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

1. Вы должны измениться list_of_keys_required , чтобы быть набором.

2. Почему мы должны это делать?

3. нам не нужно этого делать, но наборы работают быстрее, чем списки. и нет никаких причин, почему бы не использовать их (в данном случае).