#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. нам не нужно этого делать, но наборы работают быстрее, чем списки. и нет никаких причин, почему бы не использовать их (в данном случае).