Python — получение списка во вложенном JSON

#python #json

#python #json

Вопрос:

Я относительно новичок в программировании, извините, у меня уже был ответ на этот вопрос.

Я пытаюсь получить конкретное значение из JSON, которое я получил от API. JSON выглядит так после того, как я вставил вкладку в первый {} и сохранил его в список.

Теперь мне нужно извлечь все значения «term». Перепробовал много подходов, но я не смог найти правильный подход к нему.

 [
  [
    {
      'id': 292,
      'categories': [
        
      ],
      'terms': [
        {
          'term': 'Erprobung'
        },
        {
          'term': 'Probe'
        },
        {
          'term': 'Prüfung'
        },
        {
          'term': 'Test'
        },
        {
          'term': 'Versuch'
        }
      ]
    },
    {
      'id': 4398,
      'categories': [
        
      ],
      'terms': [
        {
          'term': 'Leistungsnachweis'
        },
        {
          'term': 'Prüfung'
        },
        {
          'term': 'Test'
        }
      ]
    },
    {
      'id': 5752,
      'categories': [
        
      ],
      'terms': [
        {
          'term': 'Klassenarbeit'
        },
        {
          'term': 'Klausur'
        },
        {
          'term': 'Leistungsüberprüfung'
        },
        {
          'term': 'Lernerfolgskontrolle'
        },
        {
          'term': 'Prüfung'
        },
        {
          'term': 'Schularbeit'
        },
        {
          'term': 'Schulaufgabe'
        },
        {
          'term': 'Test'
        },
        {
          'term': 'Arbeit',
          'level': 'umgangssprachlich'
        }
      ]
    },
    {
      'id': 9138,
      'categories': [
        
      ],
      'terms': [
        {
          'term': 'Experiment'
        },
        {
          'term': '(die) Probe aufs Exempel'
        },
        {
          'term': 'Probelauf'
        },
        {
          'term': 'Studie'
        },
        {
          'term': 'Test'
        },
        {
          'term': 'Testballon'
        },
        {
          'term': 'Testlauf'
        },
        {
          'term': 'Trockenlauf'
        },
        {
          'term': 'Trockentest'
        },
        {
          'term': 'Versuch'
        },
        {
          'term': 'Versuchsballon'
        }
      ]
    },
    {
      'id': 6241,
      'categories': [
        
      ],
      'terms': [
        {
          'term': 'Bewährungsprobe'
        },
        {
          'term': 'Feuerprobe'
        },
        {
          'term': 'Feuertaufe'
        },
        {
          'term': 'harte Prüfung'
        },
        {
          'term': 'Lackmustest'
        },
        {
          'term': 'Nagelprobe'
        },
        {
          'term': 'Test'
        }
      ]
    }
  ]
]
 

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

1. Добро пожаловать в SO! «Перепробовал много подходов, но я не смог найти для этого правильный подход». Не могли бы вы поделиться некоторыми из них?

2. Я должен быть честным, я удалил подход и startet из scrach. Я пробовал смесь циклов for и while. С помощью нового подхода я решил свою проблему. Тем не менее, спасибо вам и спасибо за теплый прием!

Ответ №1:

Самый простой способ — использовать понимание вложенного списка:

 >>> [term_dict["term"] for d in my_list for term_dict in d["terms"]]

['Erprobung', 'Probe', 'Prüfung', 'Test', 'Versuch', 'Leistungsnachweis',
'Prüfung', 'Test', 'Klassenarbeit', 'Klausur', 'Leistungsüberprüfung',
'Lernerfolgskontrolle', 'Prüfung', 'Schularbeit', 'Schulaufgabe', 'Test',
'Arbeit', 'Experiment', '(die) Probe aufs Exempel', 'Probelauf', 'Studie',
'Test', 'Testballon', 'Testlauf', 'Trockenlauf', 'Trockentest', 'Versuch',
'Versuchsballon', 'Bewährungsprobe', 'Feuerprobe', 'Feuertaufe', 'harte Prüfung',
'Lackmustest', 'Nagelprobe', 'Test']
 

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

1. Привет, Сельчук, спасибо за вашу помощь. К сожалению, попытка вашего подхода дает мне TypeError: list indices must be integers or slices, not str После попытки нового подхода я все равно заставил его работать. Все еще благодарю вас за вашу помощь!

Ответ №2:

Что ж, после запуска из scrach я решил свою проблему.

 new_list = []
for list_num in synonym_call:
    # ic(len(list_num))
    # ic(list_num[ITERATE TROUGH HERE]["terms"])
    # ic(list_num[len(list_num) - 1]["terms"])

    list_length = len(list_num) - 1
    while list_length > 0:
        new_list.extend(list_num[list_length - 1]["terms"])
        list_length -= 1

synonym_list = []
for term in new_list:
    synonym_list.append(term["term"])
    
print(synonym_list)
 

И это результат:

 ['Experiment', '(die) Probe aufs Exempel', 'Probelauf', 'Studie', 'Test', 'Testballon', 'Testlauf', 'Trockenlauf', 'Trockentest', 'Versuch', 'Versuchsballon', 'Klassenarbeit', 'Klausur', 'Leistungsüberprüfung', 'Lernerfolgskontrolle', 'Prüfung', 'Schularbeit', 'Schulaufgabe', 'Test', 'Arbeit', 'Leistungsnachweis', 'Prüfung', 'Test', 'Erprobung', 'Probe', 'Prüfung', 'Test', 'Versuch']
 

Я почти уверен, что есть еще более простой подход к нему, но пока он работает, и я более чем доволен им!
Спасибо всем за вашу помощь!