Синтаксический анализ json условно с использованием python

{
  "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 явно неверен. В нем отсутствуют запятые, правильное форматирование и двойной ключ info, который приводит к одной записи при загрузке.

Commissar Vasili Karlovic 20.03.2022 10:33

если не учитывать, что у вас не может быть дубликата ключа «информация» в json, является ли его значение списком (массивом) или dict (объектом)? В настоящее время [ открыт, но никогда не закрывался

re-za 20.03.2022 10:52

@re-za На самом деле дубликаты ключей действительны в JSON. См. Разрешает ли синтаксис JSON дублировать ключи в объекте?

Ouroborus 20.03.2022 11:15

@CommissarVasiliKarlovic Есть один info. Пожалуйста, проверьте.

John 20.03.2022 11:48

@CommissarVasiliKarlovic Перед публикацией я проверил формат json в Интернете. Здесь - jsonformatter.curiousconcept.com

John 20.03.2022 11:56

@John Ouroborus отредактировал исходный json, чтобы он соответствовал его ответу (смеется). Сайт, который вы разместили, дает 6 Errors в оригинале...

Commissar Vasili Karlovic 20.03.2022 12:07

@CommissarVasiliKarlovic Да. Уроборус указал на это. Первоначальный, который я отредактировал, немного информации, имел ошибки и проверил его. Кажется, я разместил неправильный. Моя вина. Серьезное преступление. Извинения. Но есть только один info. Для уверенности.

John 20.03.2022 12:17
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
7
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы устанавливаете переменную в объект каждый раз. Из-за этого переменная будет такой, какой был последний совпадающий объект. Вместо этого установите переменную в пустой список, а затем добавьте объекты в этот список.

mList = []
for m in data['info']:
    if m['subinfo']['sex'] == 'M':
         mList.append(m)

Ну, пустые списки были объявлены в коде, которым я не делился. Да. append() было обязательно. Большое спасибо. :)

John 20.03.2022 10:29

ответ неверный. Поскольку ключ info является одной записью, нет необходимости добавлять несколько записей. Таким образом, либо есть несколько уникальных ключей info1, info2, info3, и вы должны удалить info из этой скобки, либо ответа нет вообще.

Commissar Vasili Karlovic 20.03.2022 10:44

@CommissarVasiliKarlovic Аскер, кажется, не согласен с вами. Я подозреваю, что предоставленный ими JSON не соответствует их фактическим данным.

Ouroborus 20.03.2022 10:55

@Ouroborus предоставленный ими json в любом случае недействителен (например, дубликаты ключей). И как вы решили, что «информация» - это список (массив), а не дикт (объект)? в вопросе не понятно. Если у вас есть на это право, отредактируйте вопрос.

re-za 20.03.2022 10:57

@re-za JSON не имеет отношения к проблеме.

Ouroborus 20.03.2022 11:10

@Ouroborus Я подозреваю, что ОП просто удалил ключи верхнего уровня, оставив только info, и поэтому ваш ответ работает для него. Поскольку вы уже дали принятый ответ, я предлагаю указать на проблему info и явно указать, на какие предположения вы отвечаете.

Commissar Vasili Karlovic 20.03.2022 11:19

@CommissarVasiliKarlovic Я решил обновить JSON в вопросе, чтобы он был правильным и соответствовал цели вопроса.

Ouroborus 20.03.2022 11:21

@CommissarVasiliKarlovic info — ключ верхнего уровня. Я не удалил файл json.

John 20.03.2022 11:51

@Ouroborus Если вы хотите обновить JSON, вы можете это сделать, но я не удалил его. Просто КАК ЭТО ЕСТЬ. Я редактировал ТОЛЬКО name и addr

John 20.03.2022 11:54

@John Если бы это было так, вы бы получили JSONDecodeError, поскольку JSON, изначально указанный в вопросе, действительно недействителен.

Ouroborus 20.03.2022 12:02

@Ouroborus Позвольте мне проверить, у меня все еще есть оригинал и отформатированный. Дай 2 минуты.

John 20.03.2022 12:08

@Уроборус Да. Я разместил неправильный. Моя вина. Я проверил его в Интернете, но, кажется, я разместил неправильный. Извинения.

John 20.03.2022 12:12

Другие вопросы по теме