Доступ к элементу во вложенном словаре с элементами списка и под-словарями - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть словарь, который содержит список словарей, которые снова содержат списки. Словарь содержит информацию о том, существуют ли определенные особенности (булевы) в типе комнаты квартиры. Я хотел бы извлечь словарь, относящийся к одной из этих комнат - например, 'спальная комната'.

Я пробовал несколько методов нарезки. Я получил самый близкий результат к тому, чего я на самом деле хотел достичь, используя следующий код:

json['data']['offerAggregate']['property_aggregate']['property']['floors'][0]['units']['type_code' == 'bedroom']

Однако мне все же дали словарь, относящийся к «кухне», а не «спальне» (наверное, потому что это первая запись в списке).

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

Вот полная схема в том месте, где я не смог продолжить срез:

{'units': [{'type_code': 'kitchen',
   'features': [{'Code': 'fridge', 'Exists': True},
    {'Code': 'freezer', 'Exists': True},
    {'Code': 'oven', 'Exists': True},
    {'Code': 'stove', 'Exists': True},
    {'Code': 'pots-pans', 'Exists': True},
    {'Code': 'dishes-cutlery', 'Exists': True},
    {'Code': 'microwave', 'Exists': True},
    {'Code': 'washing-machine', 'Exists': True},
    {'Code': 'window', 'Exists': True},
    {'Code': 'balcony', 'Exists': False},
    {'Code': 'table', 'Exists': True},
    {'Code': 'chairs', 'Exists': False},
    {'Code': 'dryer', 'Exists': False}],
   'subunits': None},
  {'type_code': 'bathroom',
   'features': [{'Code': 'bathtub', 'Exists': False},
    {'Code': 'shower', 'Exists': True},
    {'Code': 'sink', 'Exists': True},
    {'Code': 'toilet', 'Exists': True},
    {'Code': 'window', 'Exists': False}],
   'subunits': None},
  {'type_code': 'living-room',
   'features': [{'Code': 'chairs', 'Exists': True},
    {'Code': 'sofa', 'Exists': True},
    {'Code': 'sofa-bed', 'Exists': False},
    {'Code': 'window', 'Exists': True},
    {'Code': 'balcony', 'Exists': True},
    {'Code': 'coffee-table', 'Exists': True},
    {'Code': 'table', 'Exists': True},
    {'Code': 'tv', 'Exists': True}],
   'subunits': None},
  {'type_code': 'bedroom',
   'features': [{'Code': 'wardrobe', 'Exists': True},
    {'Code': 'chest-of-drawers', 'Exists': True},
    {'Code': 'sofa', 'Exists': False},
    {'Code': 'sofa-bed', 'Exists': False},
    {'Code': 'window', 'Exists': True},
    {'Code': 'balcony', 'Exists': False}],
   'subunits': [{'id': 'd63d98a7-a5a6-47e9-8754-4b89750e22a5',
     'type_code': 'double-bed',
     'features': None}]}]}

Так что, как правило, я верю, что понимаю структуру моих данных. Но все мои попытки правильно нарезать ломтики провалились.

Любые предложения по этому вопросу будут высоко оценены!

Всего наилучшего, Hannah

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Вы можете отфильтровать спальни в списке, например:

bedrooms = [i for i in data['units'] if i['type_code'] == 'bedroom']

Затем вы можете получить доступ к функциям с помощью:

for bedroom in bedrooms:
    bedroom['features']

Если у вас есть только одна спальня, вы можете перебирать список до тех пор, пока не совпадете с ним:

for room in data['units']:
    if room['type_code'] == 'bedroom':
        # bedroom found
        room['type_code']['features']
0 голосов
/ 07 ноября 2018

Нет никакой магии, связанной с поиском по ключу dict или поиском по списку. Предполагая (для удобства чтения) мы сначала определяем

units = json['data']['offerAggregate']['property_aggregate']['property']['floors'][0]['units'])

Тогда это

something = units['type_code' == 'bedroom']

интерпретируется как

index = 'type_code' == 'bedroom'
something = unit[index]

, поскольку буквенная строка 'type_code' не сравнивается с буквальной строкой 'спальня', это равно:

index = False
something = unit[index]

и с False == 0 окончательный результат равен

something = unit[0]

который является первым изречением (typecode => 'kitchen').

units - это список диктов, поэтому вы должны зациклить его, чтобы найти первый дикт, у которого ключ 'typecode' имеет значение 'спальня' для значения:

bedroom == None

for stuff in units:
    if stuff["typecode"] == "bedroom":
        bedroom = stuff
        break

Конечно, вы можете сделать это функцией (взяв список единиц измерения и код типа).

Еще одно решение, если гарантированы уникальность типов типов, - это создать индексный дикт:

units_by_typecode = {item['typecode']: item for item in units}
bedroom = units_by_typecode["bedroom"]

или использовать какую-нибудь стороннюю библиотеку, которая знает, как выполнять такой поиск (не уверен, но Panda может иметь это)

...