Доступ к списку словарей список словарей


У меня 4-глубинной структуры данных JSON. В основном его список словарей вложенных в список словарей. Это мой первый раз работы с такого рода вложенные данные. Ниже я сделал все возможное, чтобы воспроизвести структуру:

   data = [
    0 : {"name": "hotel1",
         "overall_rating": 4, 
         "reviews": [{"rating": 5, "review" : "best place ever"},
                     {"rating": 1, "review" : "toilet was blocked"}],
        }

    1 : {"name": "hotel2",
         "overall_rating": 4,
         "reviews": [{"rating":4, "review" : "welly nice"},
                      {"rating":3, "review" : "I couldn't bring my dog"}],
        }
    ]

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

reviews = []
ratings = []

for index in range(len(data)):
    for key in data[index]:
        for key in range(len(data[index]['reviews'])):
            reviews.append(data[index]['reviews'][key]['review'])
            ratings.append(data[index]['reviews'][key]['rating'])

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



Комментарии
1 ответ

Ваши данные немного не так - вы используете список [] а затем положить в ключи (0, 1) - Я буду считать это словарь в словарь в моих примерах. Однако это было бы иначе, если бы это был список предсказывает.

data = {
0: {"name": "hotel1",
"overall_rating": 4,
"reviews": [{"rating": 5, "review" : "best place ever"},
{"rating": 1, "review" : "toilet was blocked"}],
},
1: {"name": "hotel2",
"overall_rating": 4,
"reviews": [{"rating":4, "review" : "welly nice"},
{"rating":3, "review" : "I couldn't bring my dog"}],
}
}

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

Вы можете значительно упростить ваш код просто перебором значений в данных напрямую, а потом получать reviews ключ каждого "ребенка" дикт:

ratings = []
reviews = []
for hotel in data.values():
for review in hotel['reviews']:
reviews.append(review['review'])
ratings.append(review['rating'])

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

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

tree = {
'name': 'Alice',
'relation': 'grandmother',
'child': {
'name': 'Bob',
'relation': 'father',
'child': {
'name': 'Charlie',
'relationship': 'me'
}
}
}

2
ответ дан 9 марта 2018 в 09:03 Источник Поделиться