{
"info": [
{
"subinfo": {
"name": "ABC",
"age": 23,
"sex": "M",
"addr": "xyz",
"regDt": "01-Jan-2021"
},
"city": "NY",
"eduInfo": {
"deg": "BA",
"master": "PhD"
},
"sports": {
"indoor": "poker",
"outdoor": "hockey"
}
},
{
"subinfo": {
"name": "PQR",
"age": 23,
"sex": "F",
"addr": "def",
"regDt": "01-Jan-2021"
},
"city": "NY",
"eduInfo": {
"deg": "BA",
"master": "NA"
},
"sports": {
"indoor": "poker",
"outdoor": "hockey"
}
}
]
}
Приведенные выше данные являются простым примером того, с какими данными я работаю. Есть
такие сотни из info's
в основном мужчин и женщин. Мне нужно два отдельных списка для мужчин и женщин. Итак, чтобы извлечь данные о самцах, т.е. sex = "M"
, я использую это условие
data = json.loads(data)
for m in data['info'] :
if m['subinfo']['sex'] == "M" :
mList = m
print(mList)
#and for Females list
for f in data['info'] :
if f['subinfo']['sex'] == "F" :
fList = f
print(fList)
Я ожидаю более 1 записи для каждого, мужчин и женщин, но фактический результат только по одному на каждого. Что не так с этим кодом?
если не учитывать, что у вас не может быть дубликата ключа «информация» в json, является ли его значение списком (массивом) или dict (объектом)? В настоящее время [
открыт, но никогда не закрывался
@re-za На самом деле дубликаты ключей действительны в JSON. См. Разрешает ли синтаксис JSON дублировать ключи в объекте?
@CommissarVasiliKarlovic Есть один info
. Пожалуйста, проверьте.
@CommissarVasiliKarlovic Перед публикацией я проверил формат json в Интернете. Здесь - jsonformatter.curiousconcept.com
@John Ouroborus отредактировал исходный json, чтобы он соответствовал его ответу (смеется). Сайт, который вы разместили, дает 6 Errors
в оригинале...
@CommissarVasiliKarlovic Да. Уроборус указал на это. Первоначальный, который я отредактировал, немного информации, имел ошибки и проверил его. Кажется, я разместил неправильный. Моя вина. Серьезное преступление. Извинения. Но есть только один info
. Для уверенности.
Вы устанавливаете переменную в объект каждый раз. Из-за этого переменная будет такой, какой был последний совпадающий объект. Вместо этого установите переменную в пустой список, а затем добавьте объекты в этот список.
mList = []
for m in data['info']:
if m['subinfo']['sex'] == 'M':
mList.append(m)
Ну, пустые списки были объявлены в коде, которым я не делился. Да. append()
было обязательно. Большое спасибо. :)
ответ неверный. Поскольку ключ info
является одной записью, нет необходимости добавлять несколько записей. Таким образом, либо есть несколько уникальных ключей info1
, info2
, info3
, и вы должны удалить info
из этой скобки, либо ответа нет вообще.
@CommissarVasiliKarlovic Аскер, кажется, не согласен с вами. Я подозреваю, что предоставленный ими JSON не соответствует их фактическим данным.
@Ouroborus предоставленный ими json в любом случае недействителен (например, дубликаты ключей). И как вы решили, что «информация» - это список (массив), а не дикт (объект)? в вопросе не понятно. Если у вас есть на это право, отредактируйте вопрос.
@re-za JSON не имеет отношения к проблеме.
@Ouroborus Я подозреваю, что ОП просто удалил ключи верхнего уровня, оставив только info
, и поэтому ваш ответ работает для него. Поскольку вы уже дали принятый ответ, я предлагаю указать на проблему info
и явно указать, на какие предположения вы отвечаете.
@CommissarVasiliKarlovic Я решил обновить JSON в вопросе, чтобы он был правильным и соответствовал цели вопроса.
@CommissarVasiliKarlovic info
— ключ верхнего уровня. Я не удалил файл json.
@Ouroborus Если вы хотите обновить JSON, вы можете это сделать, но я не удалил его. Просто КАК ЭТО ЕСТЬ. Я редактировал ТОЛЬКО name
и addr
@John Если бы это было так, вы бы получили JSONDecodeError
, поскольку JSON, изначально указанный в вопросе, действительно недействителен.
@Ouroborus Позвольте мне проверить, у меня все еще есть оригинал и отформатированный. Дай 2 минуты.
@Уроборус Да. Я разместил неправильный. Моя вина. Я проверил его в Интернете, но, кажется, я разместил неправильный. Извинения.
ваш json явно неверен. В нем отсутствуют запятые, правильное форматирование и двойной ключ
info
, который приводит к одной записи при загрузке.