Доступ к данным в списке словарей python


У меня есть список словарей, с некоторыми вложенными словарями внутри:

[{'id': '67569006',
'kind': 'analytics#accountSummary',
'name': 'Adopt-a-Hydrant',
'webProperties': [{'id': 'UA-62536006-1',
                 'internalWebPropertyId': '102299473',
                 'kind': 'analytics#webPropertySummary',
                 'level': 'STANDARD',
                 'name': 'Adopt-a-Hydrant',
                 'profiles': [{'id': '107292146',
                               'kind': 'analytics#profileSummary',
                               'name': 'Adopt a Hydrant view1',
                               'type': 'WEB'},
                              {'id': '1372982608',
                               'kind': 'analytics#profileSummary',
                               'name': 'Unfiltered view',
                               'type': 'WEB'}],
                 'websiteUrl': 'https://example1.com/'}]},
{'id': '44824959',
'kind': 'analytics#accountSummary',
'name': 'Adorn',
'webProperties': [{'id': 'UA-62536006-1',
                 'internalWebPropertyId': '75233390',
                 'kind': 'analytics#webPropertySummary',
                 'level': 'STANDARD',
                 'name': 'Website 2',
                 'profiles': [{'id': '77736192',
                               'kind': 'analytics#profileSummary',
                               'name': 'All Web Site Data',
                               'type': 'WEB'}],
                 'websiteUrl': 'http://www.example2.com'}]},
]

Я пытаюсь напечатать имя сайта, url-адрес и вид, если сайт имеет 2 или более видов, напечатать их все, и вот где это становится сложным.

До сих пор я пытался:

all_properties = [The list above]
for single_property in all_properties:
    single_propery_name=single_property['name']
    view_name=single_property['webProperties'][0]['profiles'][0]['name']
    view_id=single_property['webProperties'][0]['profiles'][0]['id']
    print(single_propery_name, view_name, view_id)

Это почти работает, но он печатает только первое представление profile>name каждого свойства, однако некоторые свойства имеют более одного представления, и мне нужно также эти представления, чтобы получить печать.

Теперь выход:

Adopt-a-Hydrant Adopt a Hydrant view1 107292146
Website 2 All Web Site Data 77736192

Итак это пропуск второго представления первого свойства. Я попытался вложить sub for loop, но не могу заставить его работать, конечный результат должен быть:

Adopt-a-Hydrant Adopt a Hydrant view1 107292146
Adopt-a-Hydrant Unfiltered View 1372982608
Website 2 All Web Site Data 77736192

Любые идеи о том, как сделать это?

3 2

3 ответа:

Вам нужно перебрать список профилей для каждого single_property:

for single_property in all_properties:
    single_property_name = single_property['name']
    for profile in single_property['webProperties'][0]['profiles']:
            view_name = profile['name']
            view_id = profile['id']
            print(single_property_name, view_name, view_id)

Вероятно, вам будет полезно немного почитать в python docs О списках и о том, как их перебирать

Просто еще одно предложение с циклами oneline:

for single_property in data:
   single_propery_name=single_property['name']
   view_name = [i['name'] for i in single_property['webProperties'][0]['profiles']]
   view_id = [i['id'] for i in single_property['webProperties'][0]['profiles']]
   print(single_propery_name, view_name, view_id)

Дело в том, что вам придется делать цикл внутри списков. Вы также можете создавать объекты, если считаете, что ваши данные будут более управляемыми.

Если вы действительно запутались,не бойтесь просто сделать переменную.

Посмотрите, насколько это более читабельно:

for item in data:
    webProperties = item['webProperties'][0]
    print("Name: " + webProperties["name"])
    print("URL: " + webProperties["websiteUrl"])
    print("PRINTING VIEWS\n")
    print("----------------------------")
    views = webProperties['profiles']
    for view in views:
        print("ID: " + view['id'])
        print("Kind: " + view['kind'])
        print("Name: " + view['name'])
        print("Type: " + view['type'])
    print("----------------------------")
    print("\n\n\n")

Данные определяются как информация, которую Вы нам предоставили:

data = [{'id': '67569006',
'kind': 'analytics#accountSummary',
'name': 'Adopt-a-Hydrant',
'webProperties': [{'id': 'UA-62536006-1',
                 'internalWebPropertyId': '102299473',
                 'kind': 'analytics#webPropertySummary',
                 'level': 'STANDARD',
                 'name': 'Adopt-a-Hydrant',
                 'profiles': [{'id': '107292146',
                               'kind': 'analytics#profileSummary',
                               'name': 'Adopt a Hydrant view1',
                               'type': 'WEB'},
                              {'id': '1372982608',
                               'kind': 'analytics#profileSummary',
                               'name': 'Unfiltered view',
                               'type': 'WEB'}],
                 'websiteUrl': 'https://example1.com/'}]},
{'id': '44824959',
'kind': 'analytics#accountSummary',
'name': 'Adorn',
'webProperties': [{'id': 'UA-62536006-1',
                 'internalWebPropertyId': '75233390',
                 'kind': 'analytics#webPropertySummary',
                 'level': 'STANDARD',
                 'name': 'Website 2',
                 'profiles': [{'id': '77736192',
                               'kind': 'analytics#profileSummary',
                               'name': 'All Web Site Data',
                               'type': 'WEB'}],
                 'websiteUrl': 'http://www.example2.com'}]},
]