Понимание списка из файла JSON с несколькими элементами в списке

У меня есть некоторые проблемы с чтением вложенной структуры данных из файла .json через понимание списка.

Это мой файл:

"persons": [
    {
      "A": [
        {
          "type": "type1",
          "value": "",
          "is_valid": true
        },
        {
          "type": "type1",
          "value": "",
          "is_valid": true
        }
      ]
    },
    {
      "B": [
        {
          "type": "type2",
          "value": "",
          "is_valid": true
        }
      ]
    },
    {
      "C": [
        {
          "type": "type3",
          "value": "",
          "is_valid": true
        },
        {
          "type": "type3",
          "value": "",
          "is_valid": false
        }
      ]
    }
  ]

Я хочу прочитать все поля "persons" и вернуть список объектов Person.

В настоящее время это мой подход:

def get_all() -> list[Person]:
    persons = []
    for p in config['persons']:
        for key, values in p.items():
            for value in values:
                persons.append(Person(type=value['type'], name=f'{key}', value='{}'.format(value['value']), is_valid=value['is_valid']))
    return persons

Я попытался преобразовать его в понимание списка:

return [[(k, v) for k, v in d.items()] for d in config['persons']]

Но он возвращает список списков.

Мой объект Person имеет 4 поля:

name: str
type: str
value: str
is_valid: bool

Какую именно ошибку или нежелательное поведение вы получаете с новым кодом?

mousetail 09.02.2023 11:22

Кроме того, почему вы вообще хотите использовать понимание списка? Это никоим образом не лучше и не читабельнее

mousetail 09.02.2023 11:23

Что не так с вашей функцией get_all? выглядит хорошо для меня

Tom McLean 09.02.2023 11:26
[[ ... ] for ... in ...] это вложенный список. Зачем ты это написал, если тебе это не нужно? Если вам нужен список Person объектов, почему вы не написали [Person(...) for ... in ...]?
mkrieger1 09.02.2023 11:26

«Я пытался преобразовать его в понимание списка... Но он возвращает список списков». - да, список списков пар (k, v). Это потому, что а) вы использовали понимание вложенного списка; б) самая внутренняя часть пропускает код, который будет переходить от данных (k, v) к соответствующим Person (то есть логике для повторения v и создания экземпляра класса). Вторая часть тривиальна и может считаться опечаткой (вы просто пропускаете следующий «уровень» понимания списка). Чтобы получить сглаженный результат (вместо списка списков списков Person), см. связанные дубликаты.

Karl Knechtel 09.02.2023 12:29
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
5
71
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

На приведенном ниже рисунке объект person имеет тип list, содержащий config['persons']

return [
    (person.keys()[0], type_obj)
    for person in persons
    for type_obj in person.values()[0]
]
Ответ принят как подходящий

Чтобы продолжить понимание списка, используйте следующий подход:

persons = [Person(name=k, **f)
           for d in config['persons'] for k, v in d.items() for f in v]

Обратите внимание, как поле (dict) распаковывается **f (чтобы соответствовать остальным свойствам объекта)

Пытаться:

>>> [Person(type=value['type'], name=f'{key}', value='{}'.format(value['value']), is_valid=value['is_valid'])
         for p in config['persons']
         for key, values in p.items()
         for value in values]

[Person(type='type1', name='A', value='', is_valid=True),
 Person(type='type1', name='A', value='', is_valid=True),
 Person(type='type2', name='B', value='', is_valid=True),
 Person(type='type3', name='C', value='', is_valid=True),
 Person(type='type3', name='C', value='', is_valid=False)]

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